zoukankan      html  css  js  c++  java
  • Spring实现属性装配的几种方式和使用三种工厂模式生产bean

    基于XML的属性装配

    ①手动装配

    <!-- 手动装配 -->

    <bean id="teacherDao" class="com.xy.load.TeacherDao"></bean>
    <bean id="teacherService" class="com.xy.load.TeacherService">
    <property name="teacherDao" ref="teacherDao"></property>
    </bean>
    <bean id="teacherController" class="com.xy.load.TeacherController">
    <property name="teacherService" ref="teacherService"></property>
    </bean>

    ②自动装配

    <!-- 自动装配byType -->

    <!-- 1.按类型装配:byType -->
    <!-- 首先检测当前bean中需要装配的属性的类型 -->
    <!-- 然后在IOC容器中查找匹配这个类型的bean -->
    <!-- 如果类型匹配的bean是唯一的,那么就将这个匹配的bean注入到userAction中 -->

    <bean id="teacherDao" class="com.xy.load.TeacherDao"></bean>
    <bean id="teacherService" class="com.xy.load.TeacherService" autowire="byType">
    </bean>
    <bean id="teacherController" class="com.xy.load.TeacherController" autowire="byType">
    </bean>

    <!-- 自动装配byName -->

    <!-- 首先检测当前bean中需要装配的属性的属性名,属性名是将setXxx()方法去掉set,首字母小写得到的 -->
    <!-- 然后根据属性名作为id的值,在IOC容器中查找对应的bean -->
    <!-- 如果能够找到,则将找到bean注入进去 -->


    <bean id="teacherDao" class="com.xy.load.TeacherDao"></bean>
    <bean id="teacherService" class="com.xy.load.TeacherService" autowire="byName">
    </bean>
    <bean id="teacherController" class="com.xy.load.TeacherController" autowire="byName">
    </bean>

    3、使用注解配置bean
    ①声明bean的注解
    @Component 将当前类声明为IOC容器中的一个普通的组件
    @Controller 将当前类声明为IOC容器中的一个控制器组件
    @Service 将当前类声明为IOC容器中的业务逻辑层组件
    @Repository 将当前类声明为IOC容器中的一个持久化层组件
    Spring根据上述注解其实并不能分辨当前类是否真的是一个控制器或Dao,即使标记的类和注解不对应也没有语法错误。但在实际工作中,肯定要将专门的注解标记在对应的类上面。

    ②使用基于注解的bean的配置,需要额外导入一个jar包:spring-aop-4.0.0.RELEASE.jar
    ③需要设置自动扫描的包
    < context:component-scan base-package ="com.neuedu.ioc.bean"/>


    ④使用注解后,默认按照类名首字母小写作为id的值,也可以使用value属性指定id,value属性名也可以省略注解
                                                                                                   注解                                            id值

                                                                                     @Component                                 commonComponent
    public class CommonComponent {
    }

                                                                       @Controller(value="neueduBookAction" )      neueduBookAction
    public class BookAction {

    }

                                                                            @Service("happyService" )                           happyService
    public class BookService {

    }

    < context:component-scan base-package ="com.neuedu.ioc.bean"/>
    [1]base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。
    [2]当需要扫描多个包时可以使用逗号分隔,
    [3]如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:
    <context:component-scan base-package="com.neuedu.component" resource-pattern="autowire/*.class"/>
    [4]包含与排除
    ●<context:include-filter>子节点表示要包含的目标类
    注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。
    即:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则
    指定的组件了。
    ●<context:exclude-filter>子节点表示要排除在外的目标类
    ●component-scan下可以拥有若干个include-filter和exclude-filter子节



    ⑤使用注解进行自动装配:@Autowired注解[好处就是:连get、set方法都不用写!]
    [1]首先检测标记了@Autowired注解的属性的类型
    [2]根据类型进行装配
    [3]如果指定类型的bean不止一个,那么根据需要被装配的属性的属性名做id的值,查找bean
    [4]如果根据id值还是没有找到bean,可以使用@Qualifier注解手动指定要装配的bean的id.

    配置通过静态工厂方法创建的bean[通过静态方法提供实例对象,工厂类本身不需要实例化!

    <bean id="staticFactory" class="com.xy.bean.staticFactory" factory-method="getTeacherById">
    <constructor-arg value="teacher01"></constructor-arg>
    </bean>


    配置通过实例工厂方法创建的bean[通过实例方法提供实例对象,工厂类本身需要先创建对象!

    <bean id="instanceFactory" class="com.xy.bean.instanceFactory"></bean>
    <bean id="instanceFactory01" factory-bean="instanceFactory" factory-method="getTeacherById">
    <constructor-arg value="teacher03"></constructor-arg>
    </bean>



    配置FactoryBean
    <bean id="myFactoryBean"  class="com.xy.bean.MyFactoryBean"></bean>

  • 相关阅读:
    USACO6.4-The Primes
    ZOJ2112--Dynamic Rankings (动态区间第k大)
    Havel定理
    HDU5107---K-short Problem (线段树区间 合并、第k大)
    POJ2104-- K-th Number(主席树静态区间第k大)
    poj2409 & 2154 polya计数+欧拉函数优化
    CodeForces
    HDU
    HDU
    Gym
  • 原文地址:https://www.cnblogs.com/java-ssl-xy/p/7445533.html
Copyright © 2011-2022 走看看