IOC注解开发
spring的IOC注解开发需要添加context注解约束
IOC开发则需要引入beans注解约束
在DI属性注入的时候,IOC注解方式不需要set方法可以直接在属性上面DI进值
@value=“张三”
private string name;
对象属性注解方式注入用@Autowired因为我们习惯是按名字完成注入:所以就必须让!@Autowired和@Qualifier(value=“需要注解的对象的注解名字”)
可以用@Resource来替代上面的俩,来完成对象的注解
spring的IOC注解@component :修饰一个类,将这个类交给spring管理这个注解有三个衍生类:
@Controller:web层
@service:service层
@Repository:dao层
Bean作用范围的注解
@Scope :作用范围
singleton:默认单例
prototype:多例
XML和注解的比较
xml: 可以适用任何场景
好处:结构清晰,后期方便维护
注解:有些地方用不了,比如:这个类,不是自己提供的
好处:开发方便
XML和注解两种方式混合使用时需要在xml中引入
<context:annotation-config/>
底层AOP实现原理
JDK动态代理:只能对实现了接口的类产生代理
Cglib动态代理:对没有实现接口的类产生代理对象,生成子类对象。
反射 用的时Class
动态代理用的时Proxy
spring的术语
连接点Joinpoint:可以拦截到的点
切入点Poincut:真正被拦截到的点
通知Advice:通知,方法层面的增强
引介Introduction:类层面的增强
目标Target:被增强的对象
织入Weaviong:将通知应用(Advice)到目标(Target)的过程 将权限校验的方法的代码应用到UserDao的save方法的过程就是织入
代理Proxy:被增强后产生的代理对象
切面Aspect:多个通知和多个切入点的组合,比如拦截器
AOP入门:
1,创建目标类
2,配置目标对象的xml
<bean id="productDao" class=""></bean>
3,编写测试类
Spring整合JUnit单元测试类
引入相应的jar包test包
在测试类中添加@RunWith(SpringJUnit4ClassRunner) @ContextConfiguration(“classpath:applicationContext.xml”)注解(注解是固定的)
在测试类中添加@Resource(name=”目标类的对象productDao”)注解
创建目标类的对象private ProductDao productDao;
在测试方法中调用目标类的对象的方法即连接点。
4,编写一个切面类:切入点和通知的整合
比如说权限校验的方法
5,在xml中配置,将切面类交给spring管理
bean id=”myAspect” class=”” />
6,配置AOP实现对目标代理控制
表达式配置表示哪些类的哪些方法需要进行增强
<aop:pointcut expression="execution(*切入点的完整路径Demo2.ProductDemoImple.save(..))" <id="AOP配置的idpointcut1"/>
7,配置切面
`<aop:aspect ref="切面类的id比如上面的myAspect">
在方法执行之前校验就用before,之后用after
<aop:before method="切面的方法" poincut-ref="AOP配置的id比如pointcut1"/>
</aop:sapect>
</aop:config>
上面的表达式中的execution中的*代表任意返回值,方法save中的两个小数点代表任意参数
!
spring中的通知类型
1,前置通知:在目标方法执行之前进行操作
可以获得切入点的信息,传入参数JoinPoint joinPoint然后打印就可以获得切入点的信息
2,后置通知:在目标方法执行之后进行操作
可以获得方法的返回值然后在切面类的后置通知的方法内传入一个Object类型的以配置的返回值id为名字的参数 打印即可获得切点的返回值
3,环绕通知:在目标方法执行之前和之后进行操作
在切面内配置方法时,先配置环绕前置通知,再配置切入点方法Object obj=joinPoint.proceed()最后配置环绕后置通知,因为切入点可能有返回值所有最后要return obj;还要在方法内传参PeoceedingJoinPoint joinPoint,再在XML内配置切面aop:around method=”切入点相应的的方法” pointcut-ref=”AOp配置的id”
4,异常抛出通知:在程序异常的时候,进行的操作
直接在切面配置方法时需要传入在AOP中配置的异常id的参数Throwable ex,,打印输出ex.getMessage(),配置APO:aop:after-throwing method=”切入点相应的的方法” pointcut-ref=”AOp配置的id” throwing=”配置异常的id ex”
5,最终通知:总是会操作!
aop:after method=”切入点相应的的方法” pointcut-ref=”AOp配置的id”
切入点的表达式语法:
基于execution的函数完成的
语法 访问修饰符 方法返回值 包名.类名.方法名(参数)
public void com.spring.CustomerDao.save(..) 返回值为void类型在包com.spring下CustomerDao类中的切入点save()传入的切入点的参数为任意类型
* *.*.*Dao.save(..) 任意返回值,任意包下的名字最后为Dao的类的save方法传入的切入点的参数为任意类型
* com.spring.CustomerDao+.save(..) 返回值为任意类型在包com.spring下CustomerDao类及其子类的切入点save()传入的切入点的参数为任意类型
* com.spring.*.*(..)返回值为任意类型在包com.spring下任意类中的任意切入点 切入点传入的参数为任意类型
配置切面类
<bean id="myAspectXml" class="cn.itcast.spring.demo3.MyAspectXml"></bean>
进行 aop 的配置
<aop:config>
<aop:pointcut expression="execution(* cn.itcast.spring.demo3.*Dao.save(..))" id="pointcut1"/>
<aop:pointcut expression="execution(* cn.itcast.spring.demo3.*Dao.delete(..))" id="pointcut2"/>
<aop:pointcut expression="execution(* cn.itcast.spring.demo3.*Dao.find(..))" id="pointcut4"/>
配置切面
<aop:before method="before" pointcut-ref="pointcut1"/>
<aop:after-throwing method="afterThrowing" pointcut-ref="pointcut4"/>
<aop:after method="after" pointcut-ref="pointcut4"/>
</aop:aspect>
</aop:config>