Spring
IoC
正转:由程序员自己来创建对象
inversion of control
控制反转:由spring容器来创建对象
对于Spring而言,所有的对象都可以被看成是bean对象,所以在Spring的xml文件中使用bean节点来创建对象
对于bean节点而言,默认每个bean对象都是单例的,但是i可以通过scope来设置他的模式
scope包含有以下几个值:
singleton:默认值,单例模式
prototype:多例
request:web程序中,同一个请求将是同一个实例对象
session:web程序中,同一个会话将是同一个实例对象
global-session:web程序中,同一个全局会话(application)将是同一个实例对象
spring配置文件中bean和property的搭配,要求该bean对应的class必须要有无参构造器
对于property来设置对象属性,要求该对象的该属性必须要有标准的setter方法,这个技术点有点类似于jsp的标准动作useBean和setProperty
<jsp:useBean id=‘stu’ class=‘com.qfedu.pojo.Student’ />
Student stu = new Student();
<jsp:setProperty name = ‘stu’ property = ‘name’ value = ‘zhangsan’ />
stu.setName(“zhangsan”);
spring的配置文件中bean和constructor-arg的搭配:
1. name + value的方式,可读性最高
<constructor-args name="name" value="zhangsan" />
2. value,代码最简单,可读性最差,要求value的顺序与构造器的顺序一致,否则报错
<constructor-args value="zhangsan" />
3. index + value, 顺序可以随便写,最终的赋值是按照索引来赋值。索引从0开始
<constructor-args index='0' value='zhangsan'>
4. type + value,不同类型的属性赋值顺序随意,相同类型的属性按照顺序赋值
<construcor-args type='java.lang.String' value='zhangsan' />
Spring AOP的7种实现方式
1. Proxy.newProxyInstance()
包含三个参数:
1. 类的加载器
2. 接口的类对象们
3. InvocationHandler回调接口
其中该回调接口包含了一个回调方法:
Object invoke(Object proxy, Method method, Object[] args)
包含了三个参数:
1。 proxy代理对象
2。 method代理方法
3。 每个代理方法中的参数列表
2. Enhancer
四个步骤
* 1. 创建Enhancer对象
* 2. 设置增强类对象的superClass
* 3. 设置增强类对象的回调
MethodInterceptor回调接口,该接口中包含来一个回调方法
Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
该方法包含了四个参数:
1。 代理对象
2。 方法对象
3。 方法的参数列表
4。 方法的代理对象
* 4. 通过Enhancer对象的create()方法来创建对象并返回
3. 使用Spring写好的ProxyFactoryBean来设置aop
包含有四个子节点
target:代理对象
interfaces:代理对象的接口列表对象
optimize:是否强制使用cglib动态代理
intercepterNames:拦截对象,要求该类实现MethodIntercepter接口
4.ProxyFactoryBean
使用ProxyFactoryBean对象就可以实现代理,包含四个属性:
1. target:目标对象,在哪个对象上使用代理
2. interfaces接口们
<list>
<value>com.qfedu.service.IUserService</value>
<value>com.qfedu.service.IUserService</value>
<value>com.qfedu.service.IUserService</value>
<value>com.qfedu.service.IUserService</value>
</list>
3. interceptorNames拦截器名,就是上面定义好的实现了MethodInterceptor接口的MyAspect切面类对象
4. optimize:是否强制使用cglib的动态代理方式实现aop
true:cglib方式
false:jdk自带的代理方式
cglib:code generation library:是一个相对功能强大时的代码生成库, 效率相对于jdk自带的代理方式要高
5. 五种通知方式的xml实现
1. 前置通知 aop:before
2. 后置通知 aop:after
3. 环绕通知 aop: around
4. 有返回值的通知 aop:after-returning
5. 带有异常抛出的通知 aop:after-throwing
<aop:config proxy-target-class="true">
<aop:aspect ref="ma">
<aop:pointcut id="pc" expression="execution(* com.qfedu.aop05.*.*(..))" />
<aop:before method="myBefore" pointcut-ref="pc" />
<aop:after method="myAfter" pointcut-ref="pc" />
<aop:around method="myAround" pointcut-ref="pc" />
<aop:after-returning method="myReturn" pointcut-ref="pc" returning="obj" />
<aop:after-throwing method="myThrow" pointcut-ref="pc" throwing="e" />
</aop:aspect>
</aop:config>
6. 五种通知的注解实现方式:
<!--
context:component-scan:上下文的组件扫描
basepackage:指定要扫描的整个包
-->
<context:component-scan base-package="com.qfedu.aop06" />
<!--
aop:aspectj-autoproxy: 切面的自动代理
-->
<aop:aspectj-autoproxy />
在业务实现类之上添加Component注解并且给该组件一个名字us
在切面类之上添加两个注解,Component和Aspect
在切面类的每个方法之上分别添加@Before, @After, @Around, @AfterReturning, @AfterThrowing
其中AfterThrowing和AfterReturn里面要额外加参数obj和throwable对象
7. 新增一个类MyBeanPostProcessor实现BeanPostProcessor接口
该接口可以处理所有的bean对象的请求方法
里面有两个方法需要进行实现
postProcessBeforeInitialization
return bean对象
postProcessAfterInitialization
使用proxy的newProxyInstance()方法来对于所有的业务对象类中的方法来进行处理
在aop07.xml中新增一个节点将MyBeanPostProcessor来在xml中创建
<bean id="ius" class="com.qfedu.aop07.UserServiceImpl" />
<bean class="com.qfedu.aop07.MyBeanPostProcessor" />