Spring Bean装配
来源:互联网 发布:网络流行红歌 编辑:程序博客网 时间:2024/06/05 13:31
Spring Bean装配
配置
Spring 配置文件的一般结构如下:
<beans> <import resource=“resource1.xml” /> <import resource=“resource2.xml” /> <bean id=“bean1” class=“***”></bean> <bean name=“bean2” class=“***”></bean> <alias alias=“bean3” name=“bean2” /></beans>
Spring 的配置文件是基于XML格式的,Spring1.0的配置文件采用DTD格式,Spring2.0以后使用Schema的格式,后者让不同类型的配置拥有了自己的命名空间,是配置文件更具有扩展性。
配置文件
applicationContext.xml是spring的默认配置文件
Spring Bean 的实例化 – 构造器实例化
构造器实例化 Bean 是最简单的方式,Spring IoC容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean,如以下方式指定要创建的Bean类型:
1. 空构造器实例化:<bean id="helloServiceNoWithArgs" class="com.jike.***.HelloWorldImpl" />2. 有参数构造器实例化:<bean id="helloServiceWithArgs" class=" com.jike.***.HelloWorldmpl"> <!-- 指定构造器参数 --> <constructor-arg index="0" value="Hello Spring!"/> </bean>
Spring Bean 的实例化 – 静态工厂实例化
使用静态工厂的方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean的方法,而且使用静态工厂方法也允许指定方法参数,Spring IoC容器将调用此属性指定的方法来获取Bean,配置如下:
public class HelloWorldStaticFactory { /** * 工厂方法 * * @param message * @return */ public static HelloWorld newInstance(String message) { // 返回需要的Bean实例 return new HelloWorldImpl(message); }}<!--使用有参数构造参数--> <bean id="helloServiceStaticFactory" class="com.jike.***.HelloWorldStaticFactory" factory-method="newInstance"> <!-- 指定构造器参数 --> <constructor-arg index="0" value="Hello Static Factory!"/> </bean>
Spring Bean 的实例化 – 实例工厂实例化
使用实例工厂方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方式一样,配置如下:
public class HelloWorldInstanceFactory { /** * 工厂方法 * * @param message * @return */ public HelloWorld newInstance(String message) { // 返回需要的Bean实例 return new HelloWorldImpl(message); }} <!-- 1、定义实例工厂Bean --> <bean id="beanInstanceFactory" class="com.jike.***.HelloWorldInstanceFactory" /> <!-- 2、使用实例工厂Bean创建Bean --> <bean id=“helloWorldInstance" factory-bean="beanInstanceFactory" factory-method="newInstance"> <constructor-arg index="0" value="Hello Instance Factory!"></constructor-arg> </bean>
当用户使用Spring的WebApplicationContext时,还可以使用另外3种Bean的作用域,即request,session和globalSession。在使用Web应用环境相关的Bean作用域时,必须在Web容器中进行一些额外的配置:
低版本Web容器配置:
<filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class> </filter> <filter-mapping> <filter-name>requestContextFilter</filter-name> <servlet-name>/*</servlet-name> </filter-mapping>
高版本Web容器配置:
<listener> <listener-class> org.springframework.web.context.request.RequestContextListener</listener-class></listener>
配置文件的整合
多个配置文件:
Spring-Common.xml位于common文件夹下
Spring-Connection.xml位于connection文件夹下
Spring-Module.xml位于module文件夹下
传统加载方式:
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Common.xml","Spring-Connection.xml","Spring-ModuleA.xml"});
整合配置文件:Spring-All-Module.xml
<beans .....> <import resource="common/Spring-Common.xml"/> <import resource="connection/Spring-Connection.xml"/> <import resource="module/Spring-Module.xml"/></beans>
整合后加载方式:
ApplicationContext context = new ClassPathXmlApplicationContext(“Spring-All-Module.xml”);
注解装配
Spring是从Spring2.5开始引入使用注解自动装配的。
Spring容器是默认禁用注解装配的,因此如果要使用Spring的注解装配,你必须启用它。启用方式:使用Spring的context命名空间配置中的<context:annotation-config>
元素,配置启用如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- spring默认是禁用注解装配,添加下行代码可启用 spring支持几种不同的用于自动装配的注解 Spring自带的@Autowired JSR-330的@Inject JSR-250的@Resource --> <context:annotation-config /> </beans>
补充:参考Spring配置项<context:annotation-config/>
解释说明
当使用 <context:component-scan/>
后,就可以将 <context:annotation-config/>
移除了。
你可能会见到<context:annotation-config/>
这样一条配置,他的作用是式地向 Spring 容器注册 AutowiredAnnotationBeanPostProcessor
、CommonAnnotationBeanPostProcessor
、 PersistenceAnnotationBeanPostProcessor
以及 RequiredAnnotationBeanPostProcessor
这 4 个BeanPostProcessor
。
注册这4个 BeanPostProcessor
的作用,就是为了你的系统能够识别相应的注解
@Component
是Spring容器中的基本注解,表示容器中的一个组件(bean),可以作用在任何层次,下面的示例介绍该注解的使用方法:
注解配置示例
@Component(“userDao”)public class UserDao { …… }
等效XML配置:
<bean id=“userDao” class=“com.jike.***.UserDao”/>
Spring在2.5后提供了一个context的命名空间,它提供了通过扫描类包来加载利用注解定义的Bean的方式:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" ① xsi:schemaLocation="...... http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:component-scan base-package="com.jike.spring"/> ② </beans>
Spring 自 2.0 开始,陆续引入了一些注解用于简化 Spring 的开发。@Repository 注解便属于最先引入的一批,用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean:
① 使用 @Repository 将 DAO 类声明为 Bean @Repository public class UserDaoImpl implements UserDao{ …… } ② 在 XML 配置文件中启动 Spring 的自动扫描功能 <beans … > <context:component-scan base-package=“com.jike.dao” /> …… </beans>
Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解,共有如下四种注解:
@Component :一个泛化的概念,表示一个组件 (Bean) ,可作用在任何层次;
@Repository:用于对DAO实现类进行标注;
@Service: 用于对Service实现类进行标注;
@Controller :用于对Controller实现类进行标注;
Aware
Spring中提供了一些以Aware结尾的接口,实现了Aware接口中的bean在被初始化之后,可以获取相应资源。
通过Aware接口,可以对Spring相应资源进行操作。为对Spring进行简单的扩展提供了方便的入口。
public class MoocBeanName implements BeanNameAware, ApplicationContextAware { private String beanName; @Override public void setBeanName(String name) { this.beanName = name; System.out.println("MoocBeanName : " + name); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("setApplicationContext : " + applicationContext.getBean(this.beanName).hashCode()); }}
Bean的自动装配
如果Bean中需要装配的属性过多,那么将这些属性都在XML文件中配置就会有些麻烦,在Spring中允许使用<bean>
标签的autowire
属性来装配这些属性。
例子AutoWiringDAO如下:
package com.imooc.autowiring;public class AutoWiringDAO { public void say(String word) { System.out.println("AutoWiringDAO : " + word); }}
AutoWiringService中有个AutoWiringDAO类型属性,实现其set方法:
package com.imooc.autowiring;public class AutoWiringService { private AutoWiringDAO autoWiringDAO; public AutoWiringService() { } public AutoWiringService(AutoWiringDAO autoWiringDAO) { System.out.println("AutoWiringService"); this.autoWiringDAO = autoWiringDAO; } public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) { System.out.println("setAutoWiringDAO"); this.autoWiringDAO = autoWiringDAO; } public void say(String word) { this.autoWiringDAO.say(word); }}
byName
byName:试图在Spring容器中寻找和自动装配的Bean属性名相同的Bean名,如果未找到和属性同名的Bean,就不装配这个属性。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName"> <bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" ></bean> <bean id="autoWiringDAO" class="com.imooc.autowiring.AutoWiringDAO" ></bean> </beans>
使用测试类来测试
package com.imooc.test.autowiring;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.BlockJUnit4ClassRunner;import com.imooc.autowiring.AutoWiringService;import com.imooc.test.base.UnitTestBase;@RunWith(BlockJUnit4ClassRunner.class)public class TestAutoWiring extends UnitTestBase { public TestAutoWiring() { super("classpath:spring-autowiring.xml"); } @Test public void testSay() { AutoWiringService service = super.getBean("autoWiringService"); service.say(" this is a test"); }}
结果输出为:
setAutoWiringDAOAutoWiringDAO : this is a test
byType
byType试图在Spring容器中寻找和要装配的Bean属性类型相同或者其子类的Bean。
这样在配置Bean时可以去掉id,可实现一样的效果。
<bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" ></bean> <bean class="com.imooc.autowiring.AutoWiringDAO" ></bean>
constructor
constructors和byType类似,只是这种方式用来自动装配构造方法。如果某个构造方法的参数都可以在容器中找到同类的Bean,并且不会冲突,那么这个Spring将会自动装配这个构造方法。
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="constructor"> <bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService" ></bean> <bean id="autoWiringDAO" class="com.imooc.autowiring.AutoWiringDAO" ></bean> </beans>
- Spring Bean装配-自动装配
- spring 基本Bean装配
- Spring Bean 初级装配
- Spring Bean 高级装配
- Spring中装配bean
- Spring bean装配
- spring装配bean
- Spring笔记---装配Bean
- Spring 装配Bean
- Spring配置文件 装配Bean
- Spring-Bean的装配
- Spring之装配Bean
- Spring装配bean
- Spring Bean装配-resouce
- spring(2)装配Bean
- Spring学习-装配Bean
- spring装配Bean
- spring IOC装配bean
- struts2拦截器报错 Struts2 的错误----couldn't clear tomcat cache java.lang.NoSuchFieldException: resourceEnt
- 数组,字符串全排列算法分析(字典序生成法)
- UVA-350 Pseudo-Random Numbers
- 明明的随机数(不重复,排序)+随机数生成
- sql 语句
- Spring Bean装配
- 经典makefile例子
- Java字符串转换为日期和时间比较
- POJ 2387Til the Cows Come Home
- Android Genymotion 配合Charles代理调试
- 如何实现hibernate的缓存机制
- EXCEL导入数据库及数据库数据导出到EXCEL
- Node-mysql 之 使用流重构程序
- scala进阶6-多重界定