Bean的管理开发
# 1. IOC/DI配置管理第三方bean
# 1.1 第三方Bean的依赖导入
pom.xml中添加依赖
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
1
2
3
4
5
2
3
4
5
对于新的技术,不知道具体的坐标该如何查找?
- 直接百度搜索
- 从mvn的仓库
https://mvnrepository.com/
中进行搜索
配置属性时可以将所需的属性写在外部的properties文件中,然后导入即可
# 1.2 第三方Bean的属性配置
- resources下创建一个jdbc.properties文件,并添加对应的属性键值对
- 在applicationContext.xml中开
context
命名空间<?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 http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
1
2
3
4
5
6
7
8
9
10 - 在配置文件中使用
context
命名空间下的标签来加载properties配置文件
<context:property-placeholder location="URL" system-properties-mode="NEVER"/>
1
context
标签中system-properties-mode
:设置为NEVER,表示不加载系统属性
- 使用
${key}
来读取properties配置文件中的内容并完成属性注入
# 2. 核心容器
这里所说的核心容器,大家可以把它简单的理解为
ApplicationContext
# 2.1 容器创建
① 类路径下的XML配置文件
ApplicationContext ctx = new FileSystemXmlApplicationContext("applicationContext.xml");
1
② 文件系统下的XML配置文件(不推荐)
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\workspace\\spring\\spring_10_container\\src\\main\\resources\\applicationContext.xml");
1
# 2.2 Bean获取
① (类名) 容器对象.getBean("bean的ID")
② 容器对象.getBean("bean的ID",bean的ID.class)
③ 容器对象.getBean(bean的ID.class)
方法一需要进行类型强制转换
# 2.3 BeanFactory的使用
BeanFactory是容器的最上级父接口
- 创建容器(了解)
public class AppForBeanFactory {
public static void main(String[] args) {
Resource resources = new ClassPathResource("applicationContext.xml");
BeanFactory bf = new XmlBeanFactory(resources);
BookDao bookDao = bf.getBean(BookDao.class);
bookDao.save();
}
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
注意:
- BeanFactory是延迟加载,只有在获取bean对象的时候才会去创建
- ApplicationContext是立即加载,容器加载的时候就会创建bean对象
# 3. IOC/DI注解开发
# 3.1 注解开发定义bean
① 类上添加@Component
注解
@Component注解如果不起名称,会有一个默认值就是
当前类名首字母小写
@Component注解不可以添加在接口上,因为接口是无法创建对象的 衍生注解@Controller
、@Service
、@Repository
XML与注解配置的对应关系:
② 配置Spring的注解包扫描
<?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">
<context:component-scan base-package="com.itheima"/>
</beans>
1
2
3
4
5
6
7
2
3
4
5
6
7
注:base-package指定Spring框架扫描的包路径,它会扫描指定包及其子包中的所有类上的注解
# 3.2 纯注解开发模式
Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道
- 创建一个配置类
在配置类上添加
@Configuration
注解,将其标识为一个配置类,替换applicationContext.xml
@Configuration
public class SpringConfig {
}
1
2
3
2
3
- 用注解替换包扫描配置
在配置类上添加包扫描注解
@ComponentScan
替换<context:component-scan base-package=""/>
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
1
2
3
4
2
3
4
- 加载配置类初始化容器
//加载配置文件初始化容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//加载配置类初始化容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
1
2
3
4
2
3
4
# 3.3 注解开发bean作用范围与生命周期管理
- 使用
@Scope("prototype")
设置bean的作用范围 - 在方法上添加
@PostConstruct
和@PreDestroy
注解实现初始化和销毁方法
@Repository
@Scope("prototype")
public class BookDaoImpl implements BookDao {
@PostConstruct //在构造方法之后执行,替换 init-method
public void init() {
System.out.println("init ...");
}
@PreDestroy //在销毁方法之前执行,替换 destroy-method
public void destroy() {
System.out.println("destroy ...");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 3.4 注解开发依赖注入
Spring为了使用注解简化开发,并没有提供
构造函数注入
、setter注入
对应的注解,只提供了自动装配的注解实现 @Autowired实现属性注入
① 引用数据类型注入:
- @Autowired默认按照类型自动装配,如果IOC容器中同类的Bean找到多个,就按照变量名和Bean的名称匹配
- 按照名称自动装配:可以使用
@Qualifier
来指定注入哪个名称的bean对象
② 简单数据类型注入:
- 使用
@Value
注解,将值写入注解的参数中就行了,实现基本数据类型或者字符串注入 @Value
一般会被用在从properties配置文件中读取内容进行使用
注意:
- @Autowired可以写在属性上,也可也写在setter方法上,最简单的处理方式是
写在属性上并将setter方法删除掉
- 为什么setter方法可以删除呢?
- 自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值
- 普通反射只能获取public修饰的内容
- 暴力反射除了获取public修饰的内容还可以获取private修改的内容
- 所以此处无需提供setter方法
# 4. 注解开发总结
编辑 (opens new window)
上次更新: 2024/12/28, 07:52:50