Spring之Bean注入Spring容器中的方式
向spring容器中加入bean有以下方式:
-
通过<Bean>标签
-
@Configuration + @Bean
-
@Component + 组件扫描
-
@Import导入【见 Spring注解之@Import 】
-
实现FactoryBean接口
- 通过BeanFactory后置处理器BeanFactoryPostProcessor【见Spring之后置处理器- BeanFactoryPostProcessor】
通过<Bean>标签
在applicationContext.xml中使用<Bean>标签将Bean注入Spring容器。
无参构造
<bean id="teacher" class="com.blueStarWei.bean.Person" />
package com.blueStarWei.bean; import java.io.Serializable; public class Person implements Serializable { private String name; private int age; //setter //getter }
有参构造
<bean id="student" class="com.blueStarWei.bean.Person"> <constructor-arg name="name" value="Winn" /> <constructor-arg name="age" value="23" /> </bean>
package com.blueStarWei.bean; import java.io.Serializable; public class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } }
静态工厂方法
使用场景主要有2种:
1)创建Bean的时候需要添加额外的逻辑,可以创建自己的静态工厂方法
<bean id="person" class="com.blueStarWei.StaticBeanFactory" factory-method="getPerson" />
public class StaticBeanFactory { public static Person getPerson() { System.out.println("static person..."); return new Person(); } }
2)需要注入第三方的静态工厂方法生成的对象
<bean id="jdbc" class="java.sql.DriverManager" factory-method="getConnection" > <constructor-arg name="url" value="jdbc:mysql://127.0.0.1:3306/db"/> </bean>
实例工厂方法
与静态工厂方法的区别在于:静态工厂的方法是static的,调用的时候不用创建工厂对象;而实力工厂方法在使用的时候必须先创建工厂对象。
<!--先创建工厂实例--> <bean id="objectBeanFactory" class="com.blueStarWei.ObjectBeanFactory" /> <!--根据实例工厂中的方法创建Bean--> <bean id="student" factory-bean="objectBeanFactory" factory-method="getPerson" />
public class ObjectBeanFactory { public Person getPerson() { System.out.println("object person..."); return new Person(); } }
@Configuration + @Bean
@Configuration是用来类声明一个配置类,@Bean用来将一个方法的返回值声明为一个Bean,并将其注入Spring容器中
@Configuration public class MyConfiguration { @Bean public Person person() { Person person = new Person(); person.setName("BlueStar"); return person; } }
@Component + 组件扫描
@Component将类声明成组件,然后在配置文件中配置组件扫描,组件扫描会将@Component配置的类注入Spring容器中。
package com.blueStarWei.bean; import org.springframework.stereotype.Component; import java.io.Serializable; @Component public class Person implements Serializable { }
<!--applicaitonContext.xml--> <context:component-scan base-package="com.blueStarWei" />
实现FactoryBean接口
FactoryBean是一个接口,用来定义工厂Bean的规范【开发很少使用,一般在Spring底层中使用】
FactoryBean的实现类本身不会被注册成Bean,而是将getObject()返回的对象注册成Bean。
@Component public class MyFactoryBean implements FactoryBean<Person> { public Person getObject() throws Exception { return new Person(); } public Class<?> getObjectType() { return Person.class; } public boolean isSingleton() { return true; } }
更多内容,请访问:http://www.cnblogs.com/BlueStarWei