Spring实战-装配Bean三种方法

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); //create.....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

本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2019/09/21/Spring实战-装配Bean/
  • 发布时间: 2019-09-21 13:12
  • 更新时间: 2022-10-24 20:32
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!