Spring基础
文章目录Spring解决的主要问题IOC概念配置方式实例化的几种方式依赖注入的几种方式Bean的生命周期,作用域生命周期作用域
IOC的优势
AOP概念应用场景配置方式
文章目录
Spring解决的主要问题
任何框架的出现的本质原因都是为了提升开发者的开发效率,也就是简化我们的代码,减少大量的重复而冗杂的工作。Spring这个大容器本质上的操作就是集成,就像是一个大卖场,只是提供了一个场地,大家需要的基础服务和功能这里都有(对AspectJ框架, 字节码操作,消息服务的支持,对事务,JDBC的封装,ORM框架,web开发的支持),并且还有卖场自己的一些特色服务(面向切面编程,控制反转 )。而Spring解决的主要的问题就是对象的初始化和实例化。就拿上一个例子来说,本来每个商家(类)自己开店卖东西需要注册营业执照(初始化,实例化),但是只要到了Spring这个大卖场,里面所有登记了的商户都已经后台统一注册好了(初始化),商家需要用的时候,签个名就给你(实例化),这样就省去了每个类不停的创建对象实例化的操作,交给了Spring来统一管理,降低了类与类之间的耦合性。
IOC
概念
创建对象,依赖注入(为属性填入实例)的控制权由调用的类转变为IOC容器
BeanFactory ( IOC容器的基本接口)ApplicationContext( 扩展的IOC容器)ClassPathXmlApplicationContext ( 基于xml配置的IOC容器的实现类)
配置方式
<bean id
="userDao" class="Spring.dao.UserDaoImp">
<property name
="dog" value
="se"/>
<property name
="list">
<list>
<value>s
</value
>
</list
>
</property
>
<property name
="dao">
<list>
<ref bean
="userDao"/>
</list
>
</property
>
</bean
>
实例化的几种方式
<!--默认构造器实例化
-->
<bean id
="demo" class="Spring.factory.demo"/>
<!--静态工厂方法实例化
,用静态工厂方法创建一个connection作为springbean
-->
<!--某个类(JDBCUtils)的静态方法
(getConnection
),返回值作为bean
-->
<bean id
="connection" factory
-method
="getConnection" class="com.woniuxy.spring.common.JDBCUtils"/>
<!--工厂bean实例化
-->
<bean id
="holidayFactory" class="com.woniuxy.spring.factory.HolidayFactory"/>
<!--holidayBean
-->
<bean id
="holiday" factory
-bean
="holidayFactory" factory
-method
="create"/>
<!--FactoryBean接口实例化
-->
<bean id
="car" class="com.woniuxy.spring.factory.CarFactory"/>
依赖注入的几种方式
setter注入:<property name="index" > 构造器注入:<constructor-argcon name="index">
Bean的生命周期,作用域
生命周期
1.在bean配置上写init-method和destroy-method属性 2.实现InitializingBean和DisposableBean及其方法
public class Cycle2 implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("开始....");
}
@Override
public void destroy() throws Exception {
System.out.println("结束了....");
}
}
作用域
prototype 原型 => 每次创建一个实例singleton 单例 => 一个bean的定义,只有一个实例,不是一个类只有一个实例request 一个请求一个实例session 一个会话一个实例websocket 一次websocket链接一个实例
IOC的优势
解耦合,类与类之间的耦合度降低;提升代码的灵活性,可维护性
AOP
概念
连接点 JoinPoint 需要加入功能的位置,方法切入点 PointCut 真正执行加入功能的连接点通知 Advice 需要实现的功能切面 Aspect Java语言中,将切入点和通知等组装在一起的代码单元目标对象 Target 要操作的对象织入 Weave 将功能加入到切入点中的过程
应用场景
公共的,在很多的地方都会出现的系统功能:例如打印日志、性能监控、事务管理、安全验证等
配置方式
<?xml version
="1.0" encoding
="UTF-8"?>
<beans xmlns
="http://www.springframework.org/schema/beans"
xmlns
:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi
:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--目标对象
-->
<bean id
="userService" class="com.woniuxy.spring.aop.service.impl.UserServiceImpl"/>
<!--通知
: 实现了打日志的功能
-->
<bean id
="beforeExecution" class="com.woniuxy.spring.aop.component.BeforeExecution"/>
<!--切入点:选出了需要增加功能的方法
-->
<bean id
="pointCut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name
="pattern" value
="com.woniuxy.spring.aop.service.impl.UserServiceImpl.addUser"/>
</bean
>
<!--切面:连接切入点和通知,让打日志功能在切入点的位置执行
-->
<bean id
="aspect" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name
="pointcut" ref
="pointCut"/>
<property name
="advice" ref
="beforeExecution"/>
</bean
>
<!--包装userService
-->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>