修饰一个类,将这个类交给Spring管理
@Component(“userDao”)
//相当于
有三个衍生注解(功能相似)
@Controller;
@Service;
@Repository;
@value()
① @Autowired 设置对象类型的属性值,按照属性类型自动完成属性注入
我们习惯按照名称完成属性注入必须让@Autowired和@Qualifier(value=“”)一起完成对象属性注入
② @Resource(name="")完成对象类型的属性注入,按照名称注入(一般用这个)
@PostConstruct //初始化
@PreDestroy //摧毁
@Scope (默认单例 -singleton)
singleton 默认单例
prototype 多例
需要在xml中 添加context(扫描类上添加的注解)
xml适用任何场景
结构清晰,维护方便,一目了然
注解 如果这个类不是自己提供的就不能同注解(源码中的类) 开发编写方便
xml-bean管理类
注解-属性注入
AOP的本质是在一系列纵向的控制流程中,把那些相同的子流程提取成一个横向的面
AOP 是OOP(面向对象编程)的扩展和延伸
由AOP联盟组织提出,Spring是使用这种思想最好的框架
AOP采用的是**横向抽取机制(代理机制)**取代了传统纵向继承 AOP可以进行*权限校验,日志记录,性能监控,事务监控*
java的动态代理
jdk动态代理: 只能对实现接口的类产生daim
Cglib动态代理:对没有实现接口的类产生代理,生成子类
深圳
1.创建代理creatProxy()
public UserDao creatProxy() {
UserDao userDaoProxy = (UserDao) Proxy.newProxyInstance(
userDao.getClass().getClassLoader(), //类加载器 定义由那个类加载器加载 userDao.getClass().getInterfaces(),接口 给将要代理我俩的对象提供一组什么样的接口
this //当前代理对象调用的方法);
return userDaoProxy;
}
**2.创建接口 —>**当前代理对象调用的方法 implements InvocationHandler
然后在该接口的方法中执行判断是否增强需要增强的方法
public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { if(“save”.equals(arg1.getName())) { //增强 System.out.println(arg1.getName()+“已经增强!”); return arg1.invoke(userDao, arg2); }else { System.out.println(arg1.getName()+“没有增强!”); return arg1.invoke(userDao, arg2); } }
Proxy.newProxyInstance()方法中三个参数的解释:
这个方法的作用就是创建一个代理类对象,它接收三个参数,我们来看下几个参数的含义:
classloader: 定义了由哪个classloader(类加载器){当前对象的加载器}对象对生成的代理类进行加载 interfaces:一个interface对象数组,{当前对象的所有接口}表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。
InvocationHandler(this):一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用。
1.创建cglib的核心类对象
2.设置父类
3.设置回调
4.创建代理对象
AspectJ是AOP的一个框架,Spring引入AspectJ最为自己的AOP开发
SpringAOP开发方式: Spring基于AspectJ的Aop的开发
连接点,可以被拦截到的点(增删改成方法都可以被拦截增强—都是拦截点)
切入点,真正被拦截到的点(只对save方法进行增强)
Advice:通知
现在对save方法进行权限校验,权限校验的方法就是通知
1.引入所有依赖包
2.xml配置 引用aop约束
3.编写目标类 并在xml中配置
4.编写切面类并交给spring管理
5.通过配置完成对目标类产生代理
配置 切入点方法
配置 切面类 (通知)
spring 中通知类型
前置通知:在目标方法执行之前进行操作
获得切入点信息
后置通知:在之后进行操作
获得方法的返回值
环绕通知(事务):之前之后执行操作
环绕通知可以阻止目标方法的执行异常跑出通知:在程序出现异常的时候进行操作
最终通知:无论代码是否有异常,总会执行
Spring 切入点表达式写法:
[访问修饰符] 方法返回参数 包名.类名.方法名(参数)
*代表任意
对所有DAo中save 加权限校验
(* .DAo. *.save(…)) 通过aop 不需要修改原来的所有代码 添加删除方便
总结以上–
Spring的IOC的注解开发
注解的入门
1.引入aop包
2.引入context约束
3.类上注解开发
<context:component-scan base-package=“com.dao,Demo2” />
没有类上注解扫描 只用属性注入时context:annotation-config/
4. 类注解、属性注解、scope注解的的名称
Spring xml和注解开发的正好 xml(context)
Spring aop 动态代理
Spring aop基于aspectj的xml开发