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>

 

posted @ 2017-08-28 19:58  super_xueyi  阅读(880)  评论(0编辑  收藏  举报