Java基础复习-Spring
Java基础复习-Spring
这一部分主要是Spring和Bean相关概念的复习
1.Spring的两大特性
分别是AOP(面向切面编程)和IOC(依赖反转)
其中AOP是基于面向对象开发思想的一种补充,将业务代码中重复的部分封装为切面,实现这部分内容与业务代码的分离,降低代码的重复性和耦合度。
IOC是原本由我们去创建、管理的对象交由Spring容器进行管理,由Spring借助反射机制对Bean进行管理,使得对象的生命周期(从创建到销毁)不需要我们手动去管理。
2.Spring中AOP的实现方式
动态代理实现,包括JDK动态代理和CGLib动态代理
JDK动态代理要求相应的方法实现了某个接口,会自动生成相应的代理类,并借助反射机制去调用方法,类似于方法的拦截器,我们可以在执行方法之前或者之后作出相应功能的补充,所以我们就可以对其进行进一步的功能增强。
CGLib是继承方法对应的类,要求类不被final关键词修饰,通过继承的方式在子类去增加我们需要的功能。
Spring切面的工作称为Advise通知,包括五种类型,Spring中有相应的注解:
- @Before,在目标方法调用之前调用通知功能
- @After,在目标方法调用完毕以后调用通知
- @AfterReturning, 目标方法执行成功后执行通知
- @AfterThrowing,目标方法抛出异常后调用通知
- @Around,即Before+After
3.Bean的生命周期
Bean的生命周期大致可以分为五个阶段:
- 实例化:通过new方法或者反射机制创建Bean对象,并分配内存空间
- 设置属性:Bean的依赖注入和装配
- 初始化:Bean被创建后执行初始化操作,比如设置属性值等。
- 使用:Bean对象可以在程序中被使用
- 销毁:Bean对象不再使用以后,将其销毁并释放内存,可以通过配置文件指定
4.Spring的自动装配
Spring自动装配有三种模式,byType的根据类型装配,byName根据名称装配,以及constructor根据构造函数装配
byType,寻找依赖类型相同的Bean注入,需要借助setter方法注入,需要在XML文件中指定要注入的Bean类型
<bean id="userDao" class="com.zejian.spring.springIoc.dao.impl.UserDaoImpl" />
<!-- autowire-candidate="false" 过滤该类型 -->
<bean id="userDao2" autowire-candidate="false" class="com.zejian.spring.springIoc.dao.impl.UserDaoImpl" />
<!-- byType 根据类型自动装配userDao-->
<bean id="userService" autowire="byType" class="com.zejian.spring.springIoc.service.impl.UserServiceImpl" />
byName,将属性名与bean名称匹配,若找到则注入依赖
<bean id="userDao" class="com.zejian.spring.springIoc.dao.impl.UserDaoImpl" />
<bean id="userDao2" class="com.zejian.spring.springIoc.dao.impl.UserDaoImpl" />
<!-- byName 根据名称自动装配,找到UserServiceImpl名为 userDao属性并注入-->
<bean id="userService" autowire="byName" class="com.zejian.spring.springIoc.service.impl.UserServiceImpl" />
constructor,优先进行参数匹配,再进行名称优先匹配
5.Spring注入方式
Spring常见的注入方式包括构造器注入、setter方法,注解注入等
构造器注入通过@Autowired注解指定使用的构造方法,是最适用的注入方法
@Service
public class AService {
BService bService;
@Autowired
public AService(BService bService) {
this.bService = bService;
}
}
setter方法注入,需要严格为成员对象提供set方法
@Service
public class BService {
AService aService;
@Autowired
public void setaService(AService aService) {
this.aService = aService;
}
}
注解方式注入
适用于我们自己写的对象实例,使用@Autowired或者@Resource注解,前者默认优先按照类型装配,后者默认优先按照名称装配
6.Spring事务
编程式事务:通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。
声明式事务:将事务管理代码从业务方法中分离出来,通过aop进行封装。Spring声明式事务使得我们无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。使用 @Transactional 注解开启声明式事务