Spring的注解与动态代理
Spring框架IOC控制反转 依赖注入
1、Spring框架注解总结(JDK1.5以后开始扩充的注解)
使用步骤:
1、导入spring-aop-4.1.3.RELEASE.jar架包。
2、在配置文件中添加 xmlns:context="http://www.springframework.org/schema/context"命名空间。
3、在配置文件中使用 <context:component-scan base-package="com.zltz"></context:component-scan>扫描加注解的包。
4、注解:
1、类加载Spring容器注解:@Component(value="当前类的ID") 注解;
2、类属性注入注解: @Value(Value="属性值") 注解;-----》类属性注解时不需要给set和get方法。
老程序猿一般会把@Value(Value="属性值")注解现在属性的get和set方法上。
3、类中再加载一类: @Autowired注解 该注解中有required属性,该属性的默认值为true 可以手动修改为false,为false时Spring在引用类中不加载被引用类。
如: public class Cat{
@Autowired
private Dog dog;
}
类注解注入时,被注解的类为接口时在其实现类上加@Component 注解,若有多个实现类时应使用@Qualifier(value="实现类的ID")注解
类注入注解还有一个@Resources注解
类加载器:分层加载使用:
controller层:@Controller注解
Service层: @Service注解
dao层: @Repository注解
5、类加载的方式:
1、xml配置文件的方式装配
注意:让xml文件和注解方式同时生效:加 <context:annotation-config></context:annotation-config>
2、注解的方式装配。
3、纯java代码的方式装配
java代码方式:
使用java类充当配置类 这个类上加@Configuration注解来设置
在类中使用@bean(name="名")注解注入其他的类,如果不写name默认为方法名。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Spring框架AOP面向切面编程:
1、java静态代理:
在代理对象中实例目标对象实现增强代码功能。
缺点:有多少目标对象就有多少代理对象。
2、动态代理:
1、JDK的动态代理:
注意:被代理对象必须实现一个接口,也可以实现多个接口(也就是必须是接口的实现类)。
代理对象:
public class MyStu implements InvocationHandler{
private Object stu
public Object carePxry(Object stu) {
this.stu=stu;
需要三个参数:
1、类加载器使用和目标对象一样的加载器
2、目标对象的接口
3、代理对象执行方法要调用的处理程序,如果参数三是this的话,代理类必须实现InvocationHandler接口
return Proxy.newProxyInstance(参数1:stu.getClass().getClassLoader,参数2:stu.getClass.getInterfaces(),参数3:this);-------------->JDK动态代理主要代码
}
//参数三为this实现接口InvocationHandler接口,实现接口的invoke方法
方法需要三个参数:
1、proxy 动态代理的根对象。
2、method 动态代理对象要执行的方法
3、args 动态代理对象要执行的方法的参数列表
public Object invoke(Object proxy,Method method,Object[] args){
Object res=method.invoke(this.stu,args); 需要两个参数 1、目标实例;2、参数列表------》此方法相当于调用目标对象的方法。
return res;
}
}
注意:动态代理的对象和new的对象不一样。-----》比较地址就能看出动态代理的对象地址开头为$符。
2、Cglib的动态代理 (CGlib采用非常底层字节码技术,可以为一个类创建子类,解决无接口代理问题)------》可以没有接口
public class Cglib{
private Enhancer enhancer=new Enhancer();
public Object getpxy(Class clszz){
enhancer.setSuperclasss(clszz);
enhancer.setCallback(this);---------------------->此参数为this必须实现MethodInterceptor接口
return enhancer.creater();
}
//实现接口的方法
public Object intercept(Object obj,Method method,Object[] args,MethodProxy proxy){
Object stu=proxy.invokeSuper(obj,args);
return stu;
}
}