- 操作容器之前,先要有容器,所以先要得到容器。
- 存对象
- a. 创建 Bean(普通类)。
- b. 将 Bean 注册(配置)到 spring-confing.xml
<?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">
</beans>
- 取对象
- a. 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
- b. 获取某⼀个 Bean 对象。
- c. 使⽤ Bean 对象。
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//1. 通过getBean(String var1)获取对象
User user = (User)context.getBean("user");
user.sayHi();
//2. 通过 getBean(Class<T> var1) 来获取对象
User user2 = context.getBean(User.class);
user2.sayHi();
//3. 通过 getBean(String var1, Class<T> var2)来获取bean
User user3 = context.getBean("user",User.class);
user3.sayHi();
}
<bean id="user" class="com.bite.User">
<constructor-arg name="name" value="zhangsan"></constructor-arg>
</bean>
ApplicationContext VS BeanFactory(常⻅⾯试题)
- 继承关系和功能⽅⾯来说:Spring 容器有两个顶级的接⼝:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持。
- 从性能⽅⾯来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽ BeanFactory 是需要那个才去加载那个,因此更加轻量
⽽ ClassPathXmlApplicationContext 属于 ApplicationContext 的⼦类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。
@RestController = @Repository + @Repository
类注解:@Controller、@Service、@Repository、@Component、@Configuration。
⽅法注解:@Bean。
对象装配(对象注⼊)(@Autowired)的实现⽅法以下 3 种:
- 属性注⼊
- 构造⽅法注⼊
- Setter 注⼊
三种注⼊优缺点分析
- 属性注⼊的优点是简洁,使⽤⽅便;缺点是只能⽤于 IoC 容器,如果是⾮ IoC 容器不可⽤,并且只
有在使⽤的时候才会出现 NPE(空指针异常)。
- 构造⽅法注⼊是 Spring 推荐的注⼊⽅式,它的缺点是如果有多个注⼊会显得⽐较臃肿,但出现这
种情况你应该考虑⼀下当前类是否符合程序的单⼀职责的设计模式了,它的优点是通⽤性,在使⽤
之前⼀定能把保证注⼊的类不为空。
- Setter ⽅式是 Spring 前期版本推荐的注⼊⽅式,但通⽤性不如构造⽅法,所有 Spring 现版本已
经推荐使⽤构造⽅法注⼊的⽅式来进⾏类注⼊了。
@Resource:另⼀种注⼊关键字
@Controller
public class UserController4 {
@Resource
private UserService userService;
@Resource(name = "user")
private User user1;
public void sayHi(){
userService.doService();
System.out.println(user1.getName());
System.out.println("hi, userController4...");
}
}
@Autowired 和 @Resource 的区别
出身不同:@Autowired 来⾃于 Spring,⽽ @Resource 来⾃于 JDK 的注解;
使⽤时设置的参数不同:相⽐于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如
name 设置,根据名称获取 Bean。
@Autowired 可⽤于 Setter 注⼊、构造函数注⼊和属性注⼊,⽽ @Resource 只能⽤于 Setter 注
⼊和属性注⼊,不能⽤于构造函数注⼊。
同⼀类型多个 Bean 报错处理
@Autowired
@Qualifier(value = "user")
private User user;
@Resource(name = "user")
private User user1;
- 将对象存储到 Spring 中:
a. 使⽤类注解:@Controller、@Service、@Repository、@Configuration、@Component【它
们之间的关系】
b. 使⽤⽅法注解:@Bean【注意事项:必须配合类注解⼀起使⽤】 - Bean 的命名规则:⾸字⺟和第⼆个字⺟都⾮⼤写,⾸字⺟⼩写来获取 Bean,如果⾸字⺟和第⼆个
字⺟都是⼤写,那么直接使⽤原 Bean 名来获取 Bean。 - 从 Spring 中获取对象:
a. 属性注⼊
b. Setter 注⼊
c. 构造函数注⼊(推荐) - 注⼊的关键字有:
a. @Autowired
b. @Resource - @Autowired 和 @Resource 区别:出身不同; 使⽤时设置参数不同 @Resource ⽀持更多的参
数,⽐如 name。 - 解决同⼀类型多个 Bean 的报错:
a. 使⽤ @Resource(name=“”)
b. 使⽤ @Qualifier(“”)
User类
public class User {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
BeanConfiguration
@Configuration
public class BeanConfig {
@Bean
public Integer age(){
return 11;
}
@Bean
public Integer age2(){
return 12;
}
@Bean(name = {"aaa","user"})
// @Bean
public User user(Integer age){
User user = new User();
user.setName("zhangsan");
user.setAge(age);
return user;
}
@Scope("prototype")
@Bean
public User user2(){
User user = new User();
user.setName("lisi");
user.setAge(19);
return user;
}
}