Spring注解方式和配置文件方式的混用

1.注解方式和配置文件方式的混用:
    1.配置文件方式 : 用于配置对象的创建 
        <beans>
            <!--开启扫描-->
            <context:component-scan base-package="需要扫描注解的包名"></context:component-scan>
            <!--配置对象-->
            <bean id="对象在框架中的名称" class="要被创建对象那个类的全类名"></bean>            
        </beans>
    2.注解方式 : 用于搭建对象之间的引用关系 @Resource(name="被引用对象的名字")
    
2.aop的实现方式动态代理:
    1.使用JDK动态代理,针对有接口的情况,
    2.使用cglib动态代理,针对没有接口的情况;

3.代理工厂类做的事情:
    当你给动态代理工厂一个需要被代理的对象 target 时,动态代理工厂用Proxy的API给你动态创建一个代理对象proxy,并且会同时给
    这个代理对象绑定了一个invoke()方法(ps:这个invoke()方法是在一个 Invocation 类中定义的),这个invoke方法有何特
    点呢? 1.因为代理对象 proxy 是工厂给你的,这个invoke()方法也是工厂给你绑定的,所以,这个invoke()方法可以监听到你在
    什么时候,调用了这个代理 proxy 的哪个方法 method(),所以一旦你调用代理的某个方法,马上就会被invoke()方法监听到,它可以马上
    获得当前被调用的方法 method() 的对象 Method,以及调用方法的代理对象 proxy ,还有你调用方法时传入的参数 Object[] params ;
    当然,此时你也可以获得被代理的对象 target(实际操作中是让代理工厂实现了Invocation接口,那么invoke()方法也在代理类中,所以在创
    建代理类时通过构造传参,将对象target传过去),那么此时此刻,你可以在invoke(),方法中直接 用你获得的method对象,传入被代理的对象
    target 和 参数 params,这样就完成了通过代理对象 proxy 调方法,实现了 目标对象 target 的相应方法被调用,但是,但是,如果你一旦
    在invoke()方法中写点儿其他东西,比如说:你在 Method 对象invoke之前或者之后 做了一些其他的操作,那么这就意味着,此时此刻,你用
    代理调用方法,不仅意味着目标对象target的相应方法被调用,而且同时执行了其他操作,这个就是动态代理实现了功能的增强;
    
    
4.在spring框架中 , 属性注入方式:
    1.在xml中配置:
        1.属性注入<property name="" name=""(或者ref="")></property> ,需要bean类有setter,getter方法
            ps:可以用P名称空间来替代,看起来更简洁,但是相对不够直观,用得不多;
        2.构造方法注入 <constructor-arg index="0" value=""></constructor-arg>
                       <constructor-arg index="1" value=""></constructor-arg>, 需要有相应构造方法;
            ps:可以用C名称空间来替代,看起来更简洁,但是相对不够直观,用得不多;    
            
    2.注解方式配置(如果修饰属性,可以不用提供setter ,getter方法)
        1.简单属性注入: @value(值)
        2.针对属性是bean类型的注入:        
            1.@autowired() 默认是按类型匹配 ,可以和    @Qualifier(value="") 配合使用;在类型有多个匹配时,按名称匹配
            2.@Resource(name="") 按名称匹配;
        3.注意:@Value @Autowired它们可以修饰属性,也可以修饰setter方法,如果写在属性上,就不需要提供setter方法。    

5.bean注册到spring容器(工厂)管理中(注解方式):
    1.首先要开启注解扫描: 我们在applicationContext.xml文件中使用了一个标签    <context:annotation-config />,
        它代表的是可以使用spring的注解,但是我们在类上添加的注解,spring不知道位置。要解决这个问题,
        我们可以使用<context:component-sacn base-package=””>

    2.@Component    
    3.在spring2.5后为@Component添加了三个衍生的注解
        @Repository 用于DAO层
        @Service 用于service层
        @Controller  用于表现层
        
        
6.Spring在web开发中的应用
    1.在web项目中要使用spring需要导入一个jar包    
    2.在web.xml文件中配置Listener
        这个ContextLoaderListener它实现了ServletContextListener
        在这个listener中,当服务器启动时,将ApplicationContext对象,其实是它的一个实现类
        WebApplicationContext,对象存入到了ServletContext中。
    3.我们还需要在web.xml文件中配置applicationContext.xml文件的位置
        默认情况下会在WEB-INF目录 下查找applicationContext.xml
        如果applicationContext.xml文件不是在默认位置,我们可以在web.xml文件中配置    

        Classpath:applicationContext.xml 它代表的是在当前工程的类路径下(可以理解成是在src)下来查找applicationContext.xml文件。
        contextConfigLocation它是在listener中声明的一个常量,描述的就是spring配置文件的位置。
        
        
7. ssh三大框架整合之后的流程 (网上搜的)
 1. 服务器启动,启动时加载web.xml,通过spring监听器加载对应的spring配置,将配置(或配置)好的bean实例化,放入到spring容器之中。
 2. 在加载spring配置文件时,会对应的加载spring配置文件中的hibernate映射文件,
 3. 浏览器端发送请求,通过struts2的过滤器(cleanUpFilter..DispatcherFilter核心),找到对应的actionMapper,判断请求是否为action请求
 4. 如果是action请求,便会在struts2-spring容器中查找对应名字的action实例(如果不是action实例,便会直接调用jsp等其他资源作为响应)。
 5.action实例会调用Action类中对应的方法,该方法中会调用对应的service中的业务逻辑方法来响应,action会找到spring容器中对应的service实例,
    通过setter方法来注入到action中。
 6.同样,service实例中需要的dao也会以同样的方式注入到service中。之后完成对应的数据库操作。
 当然在中间会调用struts2的拦截器,这个拦截器调用的时机没有变化。
 可以根据自己的理解来叙述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章