Spring IOC的注解 笔记
1.@Component :组件
修饰一个类,将这个类交给Spring管理
@Component(“userDao”)
//相当于
有三个衍生注解(功能相似)
@Controller;
@Service;
@Repository;
2.普通属性:
@value()
3.对象类型属性:
① @Autowired 设置对象类型的属性值,按照属性类型自动完成属性注入
我们习惯按照名称完成属性注入必须让@Autowired和@Qualifier(value=“”)一起完成对象属性注入
② @Resource(name="")完成对象类型的属性注入,按照名称注入(一般用这个)
4.初始化方法和销毁方法的注解
@PostConstruct //初始化
@PreDestroy //摧毁
5.Scope作用范围
@Scope (默认单例 -singleton)
singleton 默认单例
prototype 多例
xml和注解开发的比较
需要在xml中 添加context(扫描类上添加的注解)
xml适用任何场景
结构清晰,维护方便,一目了然
注解 如果这个类不是自己提供的就不能同注解(源码中的类) 开发编写方便
xml和注解整合方式
xml-bean管理类
注解-属性注入
AOP 面向切面编程
AOP的本质是在一系列纵向的控制流程中,把那些相同的子流程提取成一个横向的面
AOP 是OOP(面向对象编程)的扩展和延伸
由AOP联盟组织提出,Spring是使用这种思想最好的框架
AOP采用的是**横向抽取机制(代理机制)**取代了传统纵向继承
AOP可以进行*权限校验,日志记录,性能监控,事务监控*
Spring底层的AOP实现原理 动态代理
java的动态代理
jdk动态代理: 只能对实现接口的类产生daim
Cglib动态代理:对没有实现接口的类产生代理,生成子类
深圳
jdk动态代理:
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);
}
}
InvocationHandler接口:proxy代理实例的调用处理程序实现的一个接口,每一个proxy代理实例都 有一个关联的调用处理程序;在代理实例调用方法时,方法调用被编码分派到调用处理程序的invoke方法。
Proxy.newProxyInstance()方法中三个参数的解释:
Proxy类就是用来创建一个代理对象的类,它提供了很多方法,但是我们最常用的是newProxyInstance方法。
这个方法的作用就是创建一个代理类对象,它接收三个参数,我们来看下几个参数的含义:
classloader: 定义了由哪个classloader(类加载器){当前对象的加载器}对象对生成的代理类进行加载
interfaces:一个interface对象数组,{当前对象的所有接口}表示我们将要给我们的代理对象提供一组什么样的接口,如果我们提供了这样一个接口对象数组,那么也就是声明了代理类实现了这些接口,代理类就可以调用接口中声明的所有方法。
InvocationHandler(this):一个InvocationHandler对象,表示的是当动态代理对象调用方法的时候会关联到哪一个InvocationHandler对象上,并最终由其调用。
Cglib动态代理:
creatProxy
1.创建cglib的核心类对象
2.设置父类
3.设置回调
4.创建代理对象
Spring的AOP的开发(AspectJ的xml方式)
AspectJ是AOP的一个框架,Spring引入AspectJ最为自己的AOP开发
SpringAOP开发方式: Spring基于AspectJ的Aop的开发
JoinPoint:
连接点,可以被拦截到的点(增删改成方法都可以被拦截增强—都是拦截点)
Pointcut:方法层面的增强
切入点,真正被拦截到的点(只对save方法进行增强)
Advice:通知
现在对save方法进行权限校验,权限校验的方法就是通知
aop xml入门开发:
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开发