菜鸟升级-----Spring学习的第二天---AOP的入门和IOC注解开发方式

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>

编写切面类advice

这里写图片描述

编写测试类

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_42799000/article/details/81319128