Spring中两个核心内容是IOC跟AOP
IOC
IOC全称是innversion of control(控制反转),把对象的管理权限交给IOC容器,降低了程序内部对象与对象之间的耦合性,使得程序之间的体系结构更加灵活。
Bean的声明
bean头文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
Bean注册
- 在xml配置文件中通过标签注册Bean
- 通过@Component、@Repository , @ Controller , @Service , @Configration注解来注册Bean到IOC容器中,交给spring管理方便解耦。
- 通过@Configuration和@Bean注解来注册,@Configuration注解用来表示一个类是配置类,相当于Spring中的xml文件;@Bean对于配置类中的方法标注,交给IOC容器注册,默认是单实例的,方法名作为组件的id。
Bean使用
@Autowired , @Resource注解,我们把注册到IOC容器中的,在使用时使用注解拿过来用
@Autowired与@Resource的区别
@Autowired跟@Resource都是是可以实现对象注入,@Autowired是Spring提供的注解,他在实现时先通过byType去寻找,找到多个时需要通过@Qualify注解去指定;@Resource时java规范中提供的注解,他在想寻找时先通过byName寻找,找不到时再通过byType去寻找。两者实现的功能相同,推荐使用@Resource他是java规范提供的,一定程度上可以实现java与Spring解耦。
Bean生命周期
实例化->属性赋值->初始化->销毁
两个相同id的Bean情况
- 使用XML配置时,同一个XML文件中不能存在两个相同的Bean,会报错;但是在两个不同的XML文件中可以配置两个相同id的bean,但是在解析加载时会覆盖掉相同id的bean
- 使用注解开发时,在Spring3.x版本后使用@Configuation去声明一个配置类,取代了XML,在使用@Bean声明了两个相同的bean时,只会将第一个注册到IOC容器中。
@Configuation
public class service{
@Bean("userService")
public UserService1 Userservice1(){
return new UserService1();
}
@Bean("userService")
public UserService2 Userservice2(){
return new UserService2();
}
}
@Autowired
private UserService1 userService1;
@Autowired
private UserService2 userService2;
//2会报错,因为Autowired是通过Type去IOC容器中寻找,
//但是UserService2没有注册到IOC中
@Resource
private UserService1 userService1;
@Resource
private UserService2 userService2;
//2会报错类型不匹配,因为Resource是通过name去IOC容器中寻找,但是返回的是一个UserService1类型的,与其类型不符合
IOC的工作流程
1、IOC容器的初始化阶段:通过对程序中的xml文件或者@bean注解等通过加载和解析等生成BeanDefination,然后把BeanDefination注册到IOC容器中,通过xml和bean注册的都会得到一个BeanDefination实体,最后把BeanDefination保存到一个Map集合中,IOC容器对这些Bean注册的信息进行处理和维护,他是IOC控制反转的一个核心。
2、完成bean的初始化和依赖注入,最后是Bean的使用,通过getBean()或者@AutoWired注解从IOC容器中获得一个Bean的实例
IOC缺点
- 加入了IOC容器,生成对象变得更加复杂
- 由于生成对象通过反射方式,所以效率上有一定损耗
- 需要大量配置工作,对于小项目影响不行
AOP
aop面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
SpringAop术语
- 连接点(joinPoint):能够被增强的方法
- 切入点(ponitCut):实际需要被增强的方法的集合
- 通知/增强(Advice):实际增强的那一部分代码
- 切面(Acpect):增强和切入点结合
增强种类
增强是我们在执行原来方法的同时,执行一些额外的增强内容,不改变原来的代码。
-
Before前置增强
增强方法先于目标执行方法,在执行目标方法之前执行的额外增强 -
After后置增强
增强方法在目标方法后执行,无论目标方法是否出现异常,都在执行后执行后置增强方法 -
AfterReturning 返回增强方法
当目标方法执行后,返回执行结果时执行,目标函数抛出异常时不执行 -
AfterThrowing 异常增强
当目标函数抛出异常时,异常增强会执行 -
Around 环绕增强
环绕增强中可以实现上述四种增强 -
DeclareParents 引入增强
这种增强与上面不同,它不是在某个方法前执行代码,而是为被增强的类,增加一个接口,并提供这个接口的实现方法,我们可以理解成它为目标类增加了方法
使用方法
在增强类中添加@Aspect注解