spring核心:
IOC、AOP
1.IOC概念和原理
什么是IOC
(1)控制反转,把对象的创建和对象之间的调用过程,交给spring来实现
(2)使用IOC的目的:降低耦合度;
2.IOC底层原理
2.1 IOC的发展历程:
1.最原始的方式:例如:UserService调用UserDao的方法时,是在UserService中创建UserDao的对象,然后调用UserDao的方法;但这种方式耦合度较高;一旦UserDao发生改变,UserService就需要做出改变,所以出现了工厂类
2.工厂类创建对象:通过工厂类创建对象,然后调用工厂类的方法类调用UserDao类中的方法,这样减低了UserService和UserDao的耦合度,但是这样耦合度还是不够低,所以出现了IOC
3.IOC创建对象
1.xml解析、工厂模式、反射
IOC过程
a.首先通过配置文件,配置要创建的对象
b.创建工厂类: 通过xml解析获取“class”属性:即得到类的路径String classValue=class属性值
通过反射创建对象:Class className=Class.forName(classValue);得到字节码文件
className.newInstance(); 创建新实例
2.2 IOC接口
1.IOC思想是基于IOC容器完成,容器本身就是工厂类
2.Spring提供IOC实现的两种方式(两个接口)
(1)BeanFactory 内部使用,不提供给开发人员进行使用;加载配置文件时不会创建对象,只有在获取的时候才会创建对象
(2)ApplicationContext BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员使用;在加载配置文件时就创建对象
3.IOC操作Bean管理
1.什么是Bean管理
(1)Spring创建对象
(2)Spring注入属性
2.Bean管理操作有两种方式
(1)基于XML配置文件方式实现
创建对象:在spring配置文件中使用Bean标签,在标签内添加对应属性,就可以实现对象创建
Bean属性:
id 标识
class 要创建的类所在的全路径
name Struct1中用,现在不怎么用
创建对象时,默认也是执行无参构造方法完成对象的创建
注入属性:
(1)DI:依赖注入:就是注入属性(创建对象的基础之上注入属性)
第一种:使用set方法
第二种:有参构造注入
1.字面量
null
属性值含有特殊字符1.使用转义字符 < < > > <![CDATA[<<南京>>]]>
Bean的作用域:在Spring可以设置创建Bean实例是单实例还是多实例
scope:
singleton:加载配置文件时就创建对象:单实例
prototype:加载配置文件时不创建对象,在调用getBean()方法时才创建对象:多实例
IOC操作Bean管理(bean生命周期)
1.通过构造器创建bean实例(无参构造方法)
2.为bean属性设置值和对其他bean引用(调用set方法)
3.调用bean的初始化方法(需要配置初始化的方法)
4.bean可以用使用(对象获取到了)
5.当容器关闭的时候,调用bean的销毁方法(需要配置销毁的方法)
IOC操作Bean管理(xml自动配置)
autowire:
byName
byType:同一类型不能创建多个对象
(2)基于注解方式实现
使用注解的目的:简化xml配置
Spring针对Bean管理中创建对象提供的注解
1.@Component 普通组件
2.@Service service层
3.@Controller web层
4.@Repository dao层
都可以用用来创建bean实例
基于注解方式实现属性注入:
1.@Autowired:根据属性类型进行注入
2.@Qualifier 根据属性名称进行注入
3.@Resource 根据类型就行注入,也可以根据根据名称进行注入
4.@Value: 注入普通类型属性
完全注解方式:代替xml配置
AOP
什么是AOP
(1)AOP:面向切面编程:利用AOP可以对业务逻辑的各个部分进行隔离,使得业务逻辑各个部分之间的耦合度降低,提高程序的可重用性,同时也提高了开发的效率。
(2)通俗的讲:在不改变源代码的情况下,在主干功能里添加新功能;
底层原理:
1.AOP底层使用动态代理
a.有接口情况:使用JDK动态代理
创建接口实现类代理对象,增强类的方法
b.没有接口情况:使用CGLIB动态代理
创建当前类子类的代理对象,增强类的方法
AOP术语:
1.连接点:类中的哪些方法可以被增强,这些方法就成为连接点
2.切入点:实际被增强的方法
切入点表达式:execution(权限修饰符返回类型类全路径方法名称(参数列表))权限修饰和返回类型用*
某一类中某一方法:execution(* 全类名.方法名(…))
某一类中所有方法:execution(* 全类名.(…))
某一包中所有类的所有方法:execution( 包名..(…))
3.通知(增强):
1.实际增强的逻辑部分成为通知(增强)
通知类型:五种
@Before前置通知、
@AfterReturning后置通知 :返回结果后才执行;如果有异常就不执行
@After 最终通知:一定被执行
@Around环绕通知、
@AfterThrowing 异常通知 有异常时才执行
4.切面:是动作,把通知应用到切入点的过程