Spring-Bean的装配的三种方式
1. 自动化装配
2. 创建被发现的bean
@Component 告知Spring为这个类创建bean
org.springframework.stereotype.Component; 在spring-content-4.1.6.RELEASE.jar中
1 2 3 4
| import org.springframework.stereotype.Component;
@Component public class User{ }
|
3. 启动组件扫描
@Configuration 声明为配置类
@ComponentScan默认扫描与配置类相同的包及子包
可以添加属性值 basePackages={“people”}
1 2 3 4 5 6
| import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;
@Configuration @ComponentScan public class build { }
|
4. 测试组件
SpringJUnit4ClassRunner 自动创建Spring应用上下文
@ContextConfiguration 加载配置
@Autowired 自动装配
自动满足bean依赖,自动注入适配bean,required=false 让这个bean处于未装配状态,如果有多个bean满足依赖关系,@Qualifer(“..”) 缩小范围,达到只有一个bean满足规定的限制条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=build.class) public class Main {
@Autowired User user; @Test public void test(){ assertNotNull(user); System.out.println(user.toString()); } }
|
❌错误:
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
导入 commons-logging-1.2.jar
java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
导入 aopalliance-1.0.jar
最终输出
User [id=0, name=null]
5. 接口装配bean
1 2 3 4 5 6
| import org.springframework.stereotype.Component;
@Component public interface People { void method(int a); }
|
而实现类实现接口
1 2 3 4 5 6 7 8 9
| import org.springframework.stereotype.Component;
@Component public class Method implements People{ public void method(int a){ System.out.println("create....."+a); } }
|
测试方法可以得到实现类结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import static org.junit.Assert.assertNotNull;
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes=Config.class) public class Main { @Autowired People people; @Test public void test(){ people.method(3); assertNotNull(people); } }
|
6. java代码装配
@Bean 创建一个bean实例并将其注入到Spring应用上下文中
1 2 3 4 5
| @Bean public User setUser() { return new User(); }
|
7. xml装配
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Configuration @ComponentScan public class build { User user; public build(){} public build(User user){ user.setId(3); this.user = user; }
}
|
1 2 3 4
| <bean id = "user" class="com.runaccpeted.test.User"></bean> <bean id = "b" class="com.runaccpeted.test.build"> <constructor-arg ref="user"></constructor-arg> </bean>
|
当构造器参数注入集合时
1 2 3 4 5 6 7
| <bean id = "build" class="com.runaccpeted.test.Build"> <constructor-arg> <list> <ref bean="user"></ref> </list> </constructor-arg> </bean>
|
set方法注入
1 2 3
| <bean id = "build" class="com.runaccpeted.test.Build"> <property name="user" ref="user"></property> </bean>
|
工作
1 2 3 4
| ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("application.xml"); build b = context.getBean(build.class); System.out.println(b.user.toString()); context.close();
|
8. 混合装配bean
javaConfig+xml
@Import(User.class) xml中拥有User的beanID
1
| <bean id = "user" class="com.runaccpeted.test.User"></bean>
|
1 2 3 4 5 6 7 8
| @Configuration @Import(User.class) public class Config{ @Bean public build setBuild(){ return new build(user); } }
|
9. bean的scope
spring中bean创建默认是单例的 scope=”singleton”
prototype 每次调用创建新实例
request 每个请求重新实例化
session 每个会话
application
global session Spring中的对象,依赖于spring-webmvc-portlet.jar