spring:注解配置、aop
2018-01-28 18:30
363 查看
使用注解配置spring
步骤1导包4(基本)+2(日志)+spring-aop
2.为主配置文件引入新的命名空间(约束)
3.开启使用注解代理配置文件
4.在类中使用注解完成配置
将对象注册到容器
修改对象的作用范围
值类型注入
通过反射的Field赋值,破坏了封装性
通过set方法赋值,推荐使用.
引用类型注入
重点
初始化|销毁方法
package cn.itcast.bean; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.annotation.Resource; import javax.xml.ws.RespectBinding; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import org.springframework.stereotype.Controller; import org.springframework.stereotype.Repository; import org.springframework.stereotype.Service; //<bean name="user" class="cn.itcast.bean.User" /> //@Component("user") // @Service("user") // service层 // @Controller("user") // web层 @Repository("user")// dao层 //指定对象的作用范围 @Scope(scopeName="singleton") public class User { private String name; @Value("18") private Integer age; //@Autowired //自动装配 //问题:如果匹配多个类型一致的对象.将无法选择具体注入哪一个对象. //@Qualifier("car2")//使用@Qualifier注解告诉spring容器自动装配哪个名称的对象 @Resource(name="car")//手动注入,指定注入哪个名称的对象 private Car car; public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public String getName() { return name; } @Value("tom") public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @PostConstruct //在对象被创建后调用.init-method public void init(){ System.out.println("我是初始化方法!"); } @PreDestroy //在销毁之前调用.destory-method public void destory(){ System.out.println("我是销毁方法!"); } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", car=" + car + "]"; } }
STS插件
安装失败率高:版本号必须匹配成关键1.查看eclipse版本号
2.去sts下载对应离线包 .zip
3.eclipse中安装离线包
spring与junit整合测试
1.导包4+2+aop+test2.配置注解
3.测试
spring中的aop
aop思想介绍spring中的aop概念
spring实现aop的原理
动态代理(优先)
被代理对象必须要实现接口,才能产生代理对象.如果没有接口将不能使用动态代理技术
cglib代理(没有接口)
第三方代理技术,cglib代理.可以对任何类生成代理.代理的原理是对目标对象进行继承代理. 如果目标对象被final修饰.那么该类无法被cglib代理.
动态代理:
package cn.itcast.c_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import cn.itcast.service.UserService; import cn.itcast.service.UserServiceImpl; //观光代码=>动态代理 public class UserServiceProxyFactory implements InvocationHandler { public UserServiceProxyFactory(UserService us) { super(); this.us = us; } private UserService us; public UserService getUserServiceProxy(){ //生成动态代理 UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), this); //返回 return usProxy; } @Override public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {//代理对象,目标对象方法字节码对象,方法参数 System.out.println("打开事务!"); Object invoke = method.invoke(us, arg2); System.out.println("提交事务!"); return invoke; } }
cglib代理
package cn.itcast.c_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import org.springframework.cglib.proxy.Callback; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import cn.itcast.service.UserService; import cn.itcast.service.UserServiceImpl; //观光代码=>cglib代理 public class UserServiceProxyFactory2 implements MethodInterceptor { public UserService getUserServiceProxy(){ Enhancer en = new Enhancer();//帮我们生成代理对象 en.setSuperclass(UserServiceImpl.class);//设置对谁进行代理 en.setCallback(this);//代理要做什么 UserService us = (UserService) en.create();//创建代理对象 return us; } @Override public Object intercept(Object obj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable { //原始对象、代理方法、参数、原始方法 //打开事务 System.out.println("打开事务!"); //调用原有方法 Object returnValue = methodProxy.invokeSuper(obj, arg); //提交事务 System.out.println("提交事务!"); return returnValue; } }
测试:
package cn.itcast.c_proxy; import org.junit.Test; import cn.itcast.service.UserService; import cn.itcast.service.UserServiceImpl; public class Demo { @Test //动态代理 public void fun1(){ UserService us = new UserServiceImpl(); UserServiceProxyFactory factory = new UserServiceProxyFactory(us); UserService usProxy = factory.getUserServiceProxy(); usProxy.save(); //代理对象与被代理对象实现了相同的接口 //代理对象 与 被代理对象没有继承关系 System.out.println(usProxy instanceof UserServiceImpl );//false } @Test public void fun2(){ UserServiceProxyFactory2 factory = new UserServiceProxyFactory2(); UserService usProxy = factory.getUserServiceProxy(); usProxy.save(); //判断代理对象是否属于被代理对象类型 //代理对象继承了被代理对象=>true System.out.println(usProxy instanceof UserServiceImpl );//true } }
aop名词学习
spring中的aop演示
步骤(xml配置)1.导包4(基本)+2(日志)+2(spring的aop包)+2(spring需要第三方aop包)
spring的aop包:
spring-aspects-4.2.4.RELEASE.jar
spring-aop-4.2.4.RELEASE.jar
spring需要第三方aop包:
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
2.准备目标对象
3.准备通知
4.配置进行织入,将通知织入目标对象中
步骤(注解配置)
1.导包4(基本)+2(日志)+2(spring的aop包)+2(spring需要第三方aop包)
spring的aop包:
spring-aspects-4.2.4.RELEASE.jar、spring-aop-4.2.4.RELEASE.jar
spring需要第三方aop包:
com.springsource.org.aopalliance-1.0.0.jar、com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
2.准备目标对象
3.准备通知
4.配置进行织入,将通知织入目标对象中
复习
一.注解代替xml配置
准备工作:
4+2 + spring-aop包
xml中导入context约束
在xml中开启扫描包中类的注解
注解:
@Component("BeanName") 将对象注册到spring容器
|- @Controler
|- @Service
|- @Repository
@Scope
指定对象的作用范围
|- singleton
|- prototype
@Value 值类型属性注入
@Autowired 自动属性注入.根据类型注入.
@Qulifier 指定注入的对象的名称
@Resource 指定对象的名称注入
@PostConstruct 初始化方法
@PreDestory 销毁方法
二.spring AOP开发
aop思想: 纵向重复,横向抽取.
|- filter中
|- 动态代理
|- interceptor中
spring AOP: 封装了动态代理技术.来体现aop.
springaop实现: 可以对所有对象进行代理
|- 动态代理
代理需要实现接口.
|- cglib代理 对目标对象继承代理.
springaop名词:
join point: 连接点.所有可以织入通知的方法.
point cut : 切入点.需要|已经织入通知的方法.
advice:
需要增强的代码.
weaving:
动词.将通知应用的切点的过程.
target: 目标对象.
proxy:
代理对象
aspect: 切面. 切入点+通知
步骤:
1.导包
4+2
2 aop+aspect
2 aop联盟+weaving
2.准备目标对象
3.准备通知类
前置通知
后置通知 方法正常结束
环绕通知
异常拦截通知
后置通知 无论如何都执行
4.配置文件中配置,导入aop约束
1>目标对象
2>通知对象
3><aop:config>
<aop:ponint-cut id="切点名称" expression="execution(切点表达式)" />
<aop:aspect ref="通知对象名称" >
<aop:before method="" ponintcut-ref="" />
<aop:after-returning method="" ponintcut-ref="" />
<aop:around method="" ponintcut-ref="" />
<aop:after-throwing method="" ponintcut-ref="" />
<aop:after method="" ponintcut-ref="" />
</aop:aspect>
扩展:使用注解完成aop
1.导包
4+2
2 aop+aspect
2 aop联盟+weaving
2.准备目标对象
3.准备通知类
4.配置文件中配置,导入aop约束
1>目标对象
2>通知对象
3><aop:aspect-autoproxy> 开启注解aop
5.注解
@Aspect 指定当前类是通知类
@Before 前置通知方法
@after-returning 后置通知方法
@around 环绕通知方法
@after-throwing 异常拦截通知方法
@after 后通知方法
@PointCut 抽取切点表达式
相关文章推荐
- 基于注解的Spring AOP的配置和使用--转载
- 基于注解的Spring AOP的配置和使用--转载
- 基于注解的Spring AOP的配置和使用
- spring AOP 零注解配置
- SpringAOP切点配置(注解与xml配置)
- Spring aop——前置增强和后置增强 使用注解Aspect和非侵入式配置
- 基于注解的Spring AOP的配置和使用
- Spring4之AOP注解配置详解
- 基于注解的Spring AOP的配置和使用--转载
- 05 Spring Aop实例(AOP 如此简单)@Aspect、@Around 注解方式配置
- 基于注解的Spring AOP的配置和使用
- 详解Spring Aop实例之AspectJ注解配置
- spring-06 之AOP 面向切面编程二 基于注解和基于xml配置文件的aop操作
- Spring学习记录(十二)---AOP理解和基于注解配置
- 05 Spring Aop实例(AOP 如此简单)@Aspect、@Around 注解方式配置
- spring aop注解配置
- spring aop注解配置web日志
- Spring整理11 -- 面对切面(AOP)1 -- 注解配置的方式实现AOP
- 【Spring进阶】spring对AOP的支持-注解方式和配置方式
- 05 Spring Aop实例(AOP 如此简单)@Aspect、@Around 注解方式配置