Spring学习总结-02
1. 配置管理第三方bean
1.1 以配置druid作案例
- 使用第三方技术需要导入依赖
在pom.xml文件中导入druid坐标
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
- 修改配置文件
- driverClassName:数据库驱动
- url:数据库连接地址
- username:数据库连接用户名
- password:数据库连接密码
<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value=""/>
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</bean>
- 在主函数里获取连接池对象,运行
1.2 加载properties文件
- 上述在spring配置文件中配置连接池信息不利于后期维护
- 将连接四要素配置在外部properties文件中,让spring去读取
- 新建properties文件,将连接四要素配置进去
jdbc.driver=
jdbc.url=
jdbc.username=
jdbc.password=
- 在applicationContext.xml中开启contexg命名空间
- 加载properties文件,location中可以配多个properties文件
<context:property-placeholder location="classpath:druidJdbc.properties"/>
- 更改bean标签信息
<bean id="druid" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
- 至此,加载properties文件完成
2. 核心容器
2.1 容器创建方式
两种方式:
- 通过ClassPathXmlApplicationContext创建(通过类路径)
- 通过FileSystemXmlApplicationContext创建(通过文件系统路径)
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\workspace\\spring\\spring_10_container\\src\\main\\resources\\applicationContext.xml");
2.2 获取bean的方式
使用getBean的三种方式:
- 只用一个参数为bean的id,得到的是Object类型,需要强转
- 只用一个参数为bean的类型,不需要强转,但必须保证bean唯一
- 用两个参数,参数一为bean的id,参数二为bean的类型,不需要强转
BookDao bookDao = (BookDao) ctx.getBean("bookDao"); //方式一
BookDao bookDao = ctx.getBean(BookDao.class); //方式二
BookDao bookDao = ctx.getBean("bookDao",BookDao.class); //方式三
2.3 容器类的层次结构
- 最上层的父接口为BeanFactory
2.4 BeanFactory
- 使用BeanFactory创建的容器是延迟加载,即初始化容器对象时,加载的bean是延迟加载
- 使用ApplicationContext创建的容器是立即加载,是Spring容器的核心接口
3. 核心容器总结
4. IOC/DI注解开发
4.1 注解开发定义bean
-
在类上添加@Component(“”),括号里填bean的id
-
删除配置文件的bean标签,配置Spring的注解包扫描
base-package中类路径越短,扫描到的包越多,速度也就越慢 -
在主函数获取bean并执行方法
-
如果在类上添加@Component不加名称
-
在主函数获取bean时按类型获取
@Component注解如果不起名称,会有一个默认值就是当前类名首字母小写,所以也可以按照名称获取
对于@Component注解,还衍生出了其他三个注解 @Controller、@Service、@Repository
方便我们后期在编写类的时候能很好的区分出这个类是属于 表现层、业务层还是数据层的类
- @Controller用于表现层,即controller层
- @Service用于业务层,即service层
- @Repository用于数据层,即dao层
4.2 纯注解开发
Spring3.0开启了纯注解开发模式,使用Java类替代配置文件,开启了Spring快速开发赛道
-
创建config类代替配置文件
-
在配置类上添加@Configuration和@ComponentScan
@Configuration:标识该类为配置类,替换applicationContext.xml文件
@ComponentScan:扫描包 -
主函数中更换获取容器的方式
因为我们不再使用配置文件,所以通过加载xml配置文件获取容器的方法ClassPathXmlApplicationContext不再使用,更换为加载配置类的AnnotationConfigApplicationContext方法、
4.3 注解开发bean作用范围与生命周期管理
4.3.1 bean作用范围
名称 | @Scope |
---|---|
类型 | 类注解 |
位置 | 类定义上方 |
作用 | 设置该类创建对象的作用范围可用于 设置创建出的bean是否为单例对象 |
属性 | value(默认):定义bean作用范围, 默认值singleton(单例),可选值prototype(非单例) |
4.3.2 Bean的生命周期
名称 | @PostConstruct |
---|---|
类型 | 方法注解 |
位置 | 方法上 |
作用 | 设置该方法为初始化方法 |
属性 | 无 |
名称 | @PreDestroy |
---|---|
类型 | 方法注解 |
位置 | 方法上 |
作用 | 设置该方法为销毁方法 |
属性 | 无 |
4.4 注解开发依赖注入
名称 | @Autowired |
---|---|
类型 | 属性注解 或 方法注解(了解) 或 方法形参注解(了解) |
位置 | 属性定义上方 或 标准set方法上方 或 类set方法上方 或 方法形参前面 |
作用 | 为引用类型属性设置值 |
属性 | required:true/false,定义该属性是否允许为null |
名称 | @Qualifier |
---|---|
类型 | 属性注解 或 方法注解(了解) |
位置 | 属性定义上方 或 标准set方法上方 或 类set方法上方 |
作用 | 为引用类型属性指定注入的bean的Id |
属性 | value(默认):设置注入的bean的Id |
名称 | @Value |
---|---|
类型 | 属性注解 或 方法注解(了解) |
位置 | 属性定义上方 或 标准set方法上方 或 类set方法上方 |
作用 | 为 基本数据类型 或 字符串类型 属性设置值 |
属性 | value(默认):要注入的属性值 |
名称 | @PropertySource |
---|---|
类型 | 类注解 |
位置 | 类定义上方 |
作用 | 加载properties文件中的属性值 |
属性 | value(默认):设置加载的properties文件对应的文件名或文件名组成的数组 |
5. IOC/DI注解开发管理第三方bean
5.1 引入外部配置类
5.1.1 使用包扫描引入
-
新建一个JdbcConfig配置类,在类上添加@Configuration,定义一个方法获取要管理的对象,并在方法上添加@Bean
添加@Bean,表示当前方法的返回值是一个bean
添加@Configuration,才能让Spring配置类扫描到
名称 | @Bean |
---|---|
类型 | 方法注解 |
位置 | 方法定义上方 |
作用 | 设置该方法的返回值作为spring管理的bean |
属性 | value(默认):定义bean的id |
- Spring配置类扫描JdbcConfig类
- 在主函数获取bean
5.1.2 使用@Import引入
-
删除JdbcConfig类上的@Configuration
-
在Spring配置类上使用@Import
@Import只能写一次,其参数是一个数组,可以引入多个配置类
名称 | @Import |
---|---|
类型 | 类注解 |
位置 | 类定义上方 |
作用 | 导入配置类 |
属性 | value(默认):定义导入的配置类类名, 当配置类有多个时使用数组格式一次性导入多个配置类 |
5.2 注解开发实现为第三方bean注入资源
5.2.1 引入简单数据类型
-
使用@Value
放在属性定义上
5.2.2 引入引用数据类型
-
给@Bean的方法加形参
Spring会在容器中查找BookDao的bean并自动装配进来,因此必须保证BookDao类被Spring配置类扫描到,也就是说容器中要由BookDao的bean