Spring 的 Bean 管理
Bean 实例化的三种方式
1. 配置文件
<!-- 无参构造配置 主要方式-->
<bean id="user" class="xin.jeson.User"/>
<!-- 静态工厂配置 -->
<bean id="user" class="xin.jeson.UserFactoryByStatic" factory-method="getUser"/>
<!-- 实例工厂配置 -->
<bean id="userFactory" class="xin.jeson.UserFactory"/>
<bean id="user" factory-bean="userFactory" factory-method="getUser"/>
2. 调用方法
// 加载 xml
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User)context.getBean("user"); // 获取对象
System.out.println(user);
3. 无参构造方法创建
必须存在无参构造,默认存在,但如果声明了有参构造默认就没有无参构造
4. 使用静态工厂创建
// 构建工厂类
public class UserFactoryByStatic {
public static User getUser() {
return new User();
}
}
5. 使用实例工厂创建
// 构建工厂类
public class UserFactory {
public User getUser() {
return new User();
}
}
Bean 标签常用属性
- id:Bean 在使用时的名字
- class:Bean 类的全路径
- name:和 id 功能一样(但是 name 可以包含特殊符号,向下兼容保留属性)
- scope:设置类的作用范围
- singleton :默认值,单例的
- protoype :多例的
- request :Web 项目中,将对象存入 request 中
- session :Web 项目中,将对象存入 session 中
- globalSession :Web 项目中,Porlet 环境中存在,否则相当于 session
属性注入
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- xmlns:p 只有使用 P 命名空间注入才需要此约束 -->
<bean id="userDao" class="xin.jeson.UserDao"/>
<!-- 使用 setter 注入 (主要的注入方式) -->
<bean id="user" class="xin.jeson.User">
<property name="name" value="Jeson"/>
<property name="userDao" ref="userDao"/>
</bean>
<!-- 使用有参构造注入 -->
<bean id="user" class="xin.jeson.User">
<constructor-arg name="name" value="Jeson"/>
<constructor-arg ref="userDao"/>
</bean>-->
<!-- P 命名空间注入 -->
<bean id="user" class="xin.jeson.User" p:name="Jeson" p:userDao-ref="userDao"/>
</beans>
<!-- 另有注解注入 -->
注解注入
需要导入 spring-aop jar 包
配置文件中需要加入 context 约束
// applicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启扫描注解 -->
<context:component-scan base-package="xin"/>
<!-- 多个包可以逗号隔开,如果包太多可以直接写最大的包名字,会包含所有子包 -->
<!-- 仅扫描属性上面的注释 -->
<context:annotation-config/>
</beans>
创建对象有四个注解
- @Component
- @Controller
- @Service
- @Repository
单/多实例
@Scope(value="prototype")
注解注入属性
@Component(value="userDao")
public class UserDao {
public void show() {
System.out.println("dao");
}
}
@Service(value="userService")
public class UserService {
@Autowried // 根据类的类型名字找类
private UserDao userDao;
@Resource(name="userDao") // 根据定义类的名字找类
private UserDao userDao;
public void show() {
System.out.println("service");
userDao.show();
}
}
注入属性的 3 种方式
- Field 注入
@Autowried // 同上示例
private UserDao userDao;
- 构造器注入(Spring 4.x 推荐)
private UserDao userDao;
@Autowired
public UserService(UserDao userDao) {
this.userDao = userDao;
}
- Setter 注入(Spring 3.x 推荐)
private UserDao userDao;
@Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
配置文件和注解混合使用
配置文件中创建对象,使用注解进行属性注入