java-------------Spring 学习02

  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;
                    
                    
                    
                    }
                
                
                }
 

猜你喜欢

转载自blog.csdn.net/qq_42891281/article/details/105133421