科技企业网站建设,专注昆明网站建设, 天堂在线搜索,中国域名根服务器IOC/DI注解开发 1.0 环境准备1.1 注解开发定义bean步骤1:删除原XML配置步骤2:Dao上添加注解步骤3:配置Spring的注解包扫描步骤4#xff1a;运行程序步骤5:Service上添加注解步骤6:运行程序知识点1:Component等 1.2 纯注解开发模式1.2.1 思路分析1.2.2 实现步骤步骤1:创建配置类… IOC/DI注解开发 1.0 环境准备1.1 注解开发定义bean步骤1:删除原XML配置步骤2:Dao上添加注解步骤3:配置Spring的注解包扫描步骤4运行程序步骤5:Service上添加注解步骤6:运行程序知识点1:Component等 1.2 纯注解开发模式1.2.1 思路分析1.2.2 实现步骤步骤1:创建配置类步骤2:标识该类为配置类步骤3:用注解替换包扫描配置步骤4:创建运行类并执行 知识点1Configuration知识点2ComponentScan 1.3 注解开发bean作用范围与生命周期管理1.3.1 环境准备1.3.2 Bean的作用范围知识点1Scope 1.3.3 Bean的生命周期知识点1PostConstruct知识点2PreDestroy 1.4 注解开发依赖注入1.4.1 环境准备1.4.2 注解实现按照类型注入1.4.3 注解实现按照名称注入1.4.4 简单数据类型注入1.4.5 注解读取properties配置文件步骤1resource下准备properties文件步骤2: 使用注解加载properties配置文件步骤3使用Value读取配置文件中的内容 知识点1Autowired知识点2Qualifier知识点3Value知识点4PropertySource 2IOC/DI注解开发管理第三方bean2.1 环境准备2.2 注解开发管理第三方bean步骤1:导入对应的jar包步骤2:在配置类中添加一个方法步骤3:在方法上添加Bean注解步骤4:从IOC容器中获取对象并打印 2.3 引入外部配置类2.3.1 使用包扫描引入步骤1:在Spring的配置类上添加包扫描步骤2:在JdbcConfig上添加配置注解步骤3:运行程序 2.3.2 使用Import引入步骤1:去除JdbcConfig类上的注解步骤2:在Spring配置类中引入步骤3:运行程序 知识点1Bean知识点2Import2.4 注解开发实现为第三方bean注入资源2.4.1 简单数据类型2.4.1.1 需求分析2.4.1.2 注入简单数据类型步骤步骤1:类中提供四个属性步骤2:使用Value注解引入值扩展 2.4.2 引用数据类型2.4.2.1 需求分析2.4.2.2 注入引用数据类型步骤步骤1:在SpringConfig中扫描BookDao步骤2:在JdbcConfig类的方法上添加参数步骤3:运行程序 3注解开发总结 要想真正简化开发就需要用到Spring的注解开发Spring对注解支持的版本历程:
2.0版开始支持注解2.5版注解功能趋于完善3.0版支持纯注解开发
关于注解开发我们要知道两块内容注解开发定义bean和纯注解开发。
注解开发定义bean用的是2.5版提供的注解纯注解开发用的是3.0版提供的注解。
1.0 环境准备
先来准备下案例环境: 创建一个Maven项目 pom.xml添加Spring的依赖 dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.10.RELEASE/version/dependency
/dependenciesresources下添加applicationContext.xml ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean idbookDao classcom.test.dao.impl.BookDaoImpl/
/beans添加BookDao、BookDaoImpl、BookService、BookServiceImpl类 public interface BookDao {public void save();
}
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ... );}
}
public interface BookService {public void save();
}public class BookServiceImpl implements BookService {public void save() {System.out.println(book service save ...);}
} 创建运行类App public class App {public static void main(String[] args) {ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDao);bookDao.save();}
}1.1 注解开发定义bean
步骤1:删除原XML配置
将配置文件中的bean标签删除掉
bean idbookDao classcom.test.dao.impl.BookDaoImpl/步骤2:Dao上添加注解
在BookDaoImpl类上添加Component注解
Component(bookDao)
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ... );}
}注意:Component注解不可以添加在接口上因为接口是无法创建对象的。
XML与注解配置的对应关系:
步骤3:配置Spring的注解包扫描
为了让Spring框架能够扫描到写在类上的注解需要在配置文件上进行包扫描
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdcontext:component-scan base-packagecom.test/
/beans说明:
component-scan
component:组件,Spring将管理的bean视作自己的一个组件scan:扫描
base-package指定Spring框架扫描的包路径它会扫描指定包及其子包中的所有类上的注解。
包路径越多[如:com.test.dao.impl]扫描的范围越小速度越快包路径越少[如:com.test],扫描的范围越大速度越慢一般扫描到项目的组织名称即Maven的groupId下[如:com.test]即可。
步骤4运行程序
运行App类查看打印结果
步骤5:Service上添加注解
同样在BookServiceImpl类上也可以添加Component交给Spring框架管理
Component
public class BookServiceImpl implements BookService {.......
}步骤6:运行程序
在App类中从IOC容器中获取BookServiceImpl对应的bean对象打印
public class App {public static void main(String[] args) {ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);BookDao bookDao (BookDao) ctx.getBean(bookDao);System.out.println(bookDao);//按类型获取beanBookService bookService ctx.getBean(BookService.class);System.out.println(bookService);}
}打印观察结果两个bean对象都已经打印到控制台
说明: BookServiceImpl类没有起名称所以在App中是按照类型来获取bean对象 Component注解如果不起名称会有一个默认值就是当前类名首字母小写所以也可以按照名称获取如 BookService bookService (BookService)ctx.getBean(bookServiceImpl);
System.out.println(bookService);对于Component注解还衍生出了其他三个注解Controller、Service、Repository
通过查看源码会发现:
这三个注解和Component注解的作用是一样的为什么要衍生出这三个呢?
方便我们后期在编写类的时候能很好的区分出这个类是属于表现层、业务层还是数据层的类。
知识点1:Component等
名称Component/Controller/Service/Repository类型类注解位置类定义上方作用设置该类为spring管理的bean属性value默认定义bean的id
1.2 纯注解开发模式
上面已经可以使用注解来配置bean,但是依然有用到配置文件在配置文件中对包进行了扫描Spring在3.0版已经支持纯注解开发
Spring3.0开启了纯注解开发模式使用Java类替代配置文件开启了Spring快速开发赛道
具体如何实现?
1.2.1 思路分析
实现思路为:
将配置文件applicationContext.xml删除掉使用类来替换。
1.2.2 实现步骤
步骤1:创建配置类
创建一个配置类SpringConfig
public class SpringConfig {
}
步骤2:标识该类为配置类
在配置类上添加Configuration注解将其标识为一个配置类,替换applicationContext.xml
Configuration
public class SpringConfig {
}步骤3:用注解替换包扫描配置
在配置类上添加包扫描注解ComponentScan替换context:component-scan base-package/
Configuration
ComponentScan(com.test)
public class SpringConfig {
}步骤4:创建运行类并执行
创建一个新的运行类AppForAnnotation
public class AppForAnnotation {public static void main(String[] args) {ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao (BookDao) ctx.getBean(bookDao);System.out.println(bookDao);BookService bookService ctx.getBean(BookService.class);System.out.println(bookService);}
}运行AppForAnnotation,可以看到两个对象依然被获取成功
至此纯注解开发的方式就已经完成了主要内容包括: Java类替换Spring核心配置文件 Configuration注解用于设定当前类为配置类 ComponentScan注解用于设定扫描路径此注解只能添加一次多个数据请用数组格式 ComponentScan({com.test.service,com.test.dao})读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象 //加载配置文件初始化容器
ApplicationContext ctx new ClassPathXmlApplicationContext(applicationContext.xml);
//加载配置类初始化容器
ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);知识点1Configuration
名称Configuration类型类注解位置类定义上方作用设置该类为spring配置类属性value默认定义bean的id
知识点2ComponentScan
名称ComponentScan类型类注解位置类定义上方作用设置spring配置类扫描路径用于加载使用注解格式定义的bean属性value默认扫描路径此路径可以逐层向下扫描
小结:
知道Component、Controller、Service、Repository这四个注解applicationContext.xml中context:component-san/的作用是指定扫描包路径注解为ComponentScanConfiguration标识该类为配置类使用类替换applicationContext.xml文件ClassPathXmlApplicationContext是加载XML配置文件AnnotationConfigApplicationContext是加载配置类
1.3 注解开发bean作用范围与生命周期管理
1.3.1 环境准备
老规矩学习之前先来准备环境: 创建一个Maven项目 pom.xml添加Spring的依赖 添加一个配置类SpringConfig Configuration
ComponentScan(com.test)
public class SpringConfig {
}添加BookDao、BookDaoImpl类 public interface BookDao {public void save();
}
Repository
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ... );}
}创建运行类App public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao1 ctx.getBean(BookDao.class);BookDao bookDao2 ctx.getBean(BookDao.class);System.out.println(bookDao1);System.out.println(bookDao2);}
}1.3.2 Bean的作用范围
(1)先运行App类,在控制台打印两个一摸一样的地址说明默认情况下bean是单例
(2)要想将BookDaoImpl变成非单例只需要在其类上添加scope注解
Repository
//Scope设置bean的作用范围
Scope(prototype)
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);}
}再次执行App类打印结果:
知识点1Scope
名称Scope类型类注解位置类定义上方作用设置该类创建对象的作用范围可用于设置创建出的bean是否为单例对象属性value默认定义bean作用范围默认值singleton单例可选值prototype非单例
1.3.3 Bean的生命周期
(1)在BookDaoImpl中添加两个方法init和destroy,方法名可以任意
Repository
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);}public void init() {System.out.println(init ...);}public void destroy() {System.out.println(destroy ...);}
}
(2)如何对方法进行标识哪个是初始化方法哪个是销毁方法?
只需要在对应的方法上添加PostConstruct和PreDestroy注解即可。
Repository
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ...);}PostConstruct //在构造方法之后执行替换 init-methodpublic void init() {System.out.println(init ...);}PreDestroy //在销毁方法之前执行,替换 destroy-methodpublic void destroy() {System.out.println(destroy ...);}
}
(3)要想看到两个方法执行需要注意的是destroy只有在容器关闭的时候才会执行所以需要修改App的类
public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao1 ctx.getBean(BookDao.class);BookDao bookDao2 ctx.getBean(BookDao.class);System.out.println(bookDao1);System.out.println(bookDao2);ctx.close(); //关闭容器}
}(4)运行App,类查看打印结果证明init和destroy方法都被执行了。
注意:PostConstruct和PreDestroy注解如果找不到需要导入下面的jar包
dependencygroupIdjavax.annotation/groupIdartifactIdjavax.annotation-api/artifactIdversion1.3.2/version
/dependency找不到的原因是从JDK9以后jdk中的javax.annotation包被移除了这两个注解刚好就在这个包中。
知识点1PostConstruct
名称PostConstruct类型方法注解位置方法上作用设置该方法为初始化方法属性无
知识点2PreDestroy
名称PreDestroy类型方法注解位置方法上作用设置该方法为销毁方法属性无
小结
1.4 注解开发依赖注入
Spring为了使用注解简化开发并没有提供构造函数注入、setter注入对应的注解只提供了自动装配的注解实现。
1.4.1 环境准备 创建一个Maven项目 pom.xml添加Spring的依赖 添加一个配置类SpringConfig Configuration
ComponentScan(com.test)
public class SpringConfig {
}添加BookDao、BookDaoImpl、BookService、BookServiceImpl类 public interface BookDao {public void save();
}
Repository
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ... );}
}
public interface BookService {public void save();
}
Service
public class BookServiceImpl implements BookService {private BookDao bookDao;public void setBookDao(BookDao bookDao) {this.bookDao bookDao;}public void save() {System.out.println(book service save ...);bookDao.save();}
}创建运行类App public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);BookService bookService ctx.getBean(BookService.class);bookService.save();}
}环境准备好后运行后会发现有问题
出现问题的原因是在BookServiceImpl类中添加了BookDao的属性并提供了setter方法但是目前是没有提供配置注入BookDao的所以bookDao对象为Null,调用其save方法就会报控指针异常。
1.4.2 注解实现按照类型注入
对于这个问题使用注解该如何解决?
(1) 在BookServiceImpl类的bookDao属性上添加Autowired注解
Service
public class BookServiceImpl implements BookService {Autowiredprivate BookDao bookDao;// public void setBookDao(BookDao bookDao) {
// this.bookDao bookDao;
// }public void save() {System.out.println(book service save ...);bookDao.save();}
}注意:
Autowired可以写在属性上也可也写在setter方法上最简单的处理方式是写在属性上并将setter方法删除掉为什么setter方法可以删除呢? 自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值普通反射只能获取public修饰的内容暴力反射除了获取public修饰的内容还可以获取private修改的内容所以此处无需提供setter方法
(2)Autowired是按照类型注入那么对应BookDao接口如果有多个实现类比如添加BookDaoImpl2
Repository
public class BookDaoImpl2 implements BookDao {public void save() {System.out.println(book dao save ...2);}
}这个时候再次运行App就会报错
此时按照类型注入就无法区分到底注入哪个对象解决方案:按照名称注入 先给两个Dao类分别起个名称 Repository(bookDao)
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ... );}
}
Repository(bookDao2)
public class BookDaoImpl2 implements BookDao {public void save() {System.out.println(book dao save ...2 );}
}此时就可以注入成功但是得思考个问题: Autowired是按照类型注入的给BookDao的两个实现起了名称它还是有两个bean对象为什么不报错? Autowired默认按照类型自动装配如果IOC容器中同类的Bean找到多个就按照变量名和Bean的名称匹配。因为变量名叫bookDao而容器中也有一个booDao所以可以成功注入。 分析下面这种情况是否能完成注入呢? 不行因为按照类型会找到多个bean对象此时会按照bookDao名称去找因为IOC容器只有名称叫bookDao1和bookDao2,所以找不到会报NoUniqueBeanDefinitionException
1.4.3 注解实现按照名称注入
当根据类型在容器中找到多个bean,注入参数的属性名又和容器中bean的名称不一致这个时候该如何解决就需要使用到Qualifier来指定注入哪个名称的bean对象。
Service
public class BookServiceImpl implements BookService {AutowiredQualifier(bookDao1)private BookDao bookDao;public void save() {System.out.println(book service save ...);bookDao.save();}
}Qualifier注解后的值就是需要注入的bean的名称。
注意:Qualifier不能独立使用必须和Autowired一起使用
1.4.4 简单数据类型注入
引用类型看完简单类型注入就比较容易懂了。简单类型注入的是基本数据类型或者字符串类型下面在BookDaoImpl类中添加一个name属性用其进行简单类型注入
Repository(bookDao)
public class BookDaoImpl implements BookDao {private String name;public void save() {System.out.println(book dao save ... name);}
}数据类型换了对应的注解也要跟着换这次使用Value注解将值写入注解的参数中就行了
Repository(bookDao)
public class BookDaoImpl implements BookDao {Value(test)private String name;public void save() {System.out.println(book dao save ... name);}
}注意数据格式要匹配如将abc注入给int值这样程序就会报错。
介绍完后会有一种感觉就是这个注解好像没什么用跟直接赋值是一个效果还没有直接赋值简单所以这个注解存在的意义是什么?
1.4.5 注解读取properties配置文件
Value一般会被用在从properties配置文件中读取内容进行使用具体如何实现?
步骤1resource下准备properties文件
jdbc.properties
nametest888步骤2: 使用注解加载properties配置文件
在配置类上添加PropertySource注解
Configuration
ComponentScan(com.test)
PropertySource(jdbc.properties)
public class SpringConfig {
}
步骤3使用Value读取配置文件中的内容
Repository(bookDao)
public class BookDaoImpl implements BookDao {Value(${name})private String name;public void save() {System.out.println(book dao save ... name);}
}步骤4:运行程序
运行App类查看运行结果说明配置文件中的内容已经被加载到 注意: 如果读取的properties配置文件有多个可以使用PropertySource的属性来指定多个 PropertySource({jdbc.properties,xxx.properties})PropertySource注解属性中不支持使用通配符*,运行会报错 PropertySource({*.properties})PropertySource注解属性中可以把classpath:加上,代表从当前项目的根路径找文件 PropertySource({classpath:jdbc.properties})知识点1Autowired
名称Autowired类型属性注解 或 方法注解了解 或 方法形参注解了解位置属性定义上方 或 标准set方法上方 或 类set方法上方 或 方法形参前面作用为引用类型属性设置值属性requiredtrue/false定义该属性是否允许为null
知识点2Qualifier
名称Qualifier类型属性注解 或 方法注解了解位置属性定义上方 或 标准set方法上方 或 类set方法上方作用为引用类型属性指定注入的beanId属性value默认设置注入的beanId
知识点3Value
名称Value类型属性注解 或 方法注解了解位置属性定义上方 或 标准set方法上方 或 类set方法上方作用为 基本数据类型 或 字符串类型 属性设置值属性value默认要注入的属性值
知识点4PropertySource
名称PropertySource类型类注解位置类定义上方作用加载properties文件中的属性值属性value默认设置加载的properties文件对应的文件名或文件名组成的数组
2IOC/DI注解开发管理第三方bean
前面定义bean的时候都是在自己开发的类上面写个注解就完成了但如果是第三方的类这些类都是在jar包中我们没有办法在类上面添加注解这个时候该怎么办?
遇到上述问题我们就需要有一种更加灵活的方式来定义bean,这种方式不能在原始代码上面书写注解一样能定义bean,这就用到了一个全新的注解Bean。
这个注解该如何使用呢?
2.1 环境准备
学习Bean注解之前先来准备环境: 创建一个Maven项目 pom.xml添加Spring的依赖 添加一个配置类SpringConfig Configuration
public class SpringConfig {
}添加BookDao、BookDaoImpl类 public interface BookDao {public void save();
}
Repository
public class BookDaoImpl implements BookDao {public void save() {System.out.println(book dao save ... );}
}创建运行类App public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);}
}2.2 注解开发管理第三方bean
在上述环境中完成对Druid数据源的管理具体的实现步骤为:
步骤1:导入对应的jar包
dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.16/version
/dependency步骤2:在配置类中添加一个方法
注意该方法的返回值就是要创建的Bean对象类型
Configuration
public class SpringConfig {public DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}步骤3:在方法上添加Bean注解
Bean注解的作用是将方法的返回值制作为Spring管理的一个bean对象
Configuration
public class SpringConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}注意:不能使用DataSource ds new DruidDataSource()
因为DataSource接口中没有对应的setter方法来设置属性。
步骤4:从IOC容器中获取对象并打印
public class App {public static void main(String[] args) {AnnotationConfigApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);DataSource dataSource ctx.getBean(DataSource.class);System.out.println(dataSource);}
}至此使用Bean来管理第三方bean的案例就已经完成。
如果有多个bean要被Spring管理直接在配置类中多些几个方法方法上添加Bean注解即可。
2.3 引入外部配置类
如果把所有的第三方bean都配置到Spring的配置类SpringConfig中虽然可以但是不利于代码阅读和分类管理所有我们就想能不能按照类别将这些bean配置到不同的配置类中?
对于数据源的bean,我们新建一个JdbcConfig配置类并把数据源配置到该类下。
public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}现在的问题是这个配置类如何能被Spring配置类加载到并创建DataSource对象在IOC容器中?
针对这个问题有两个解决方案:
2.3.1 使用包扫描引入
步骤1:在Spring的配置类上添加包扫描
Configuration
ComponentScan(com.test.config)
public class SpringConfig {}步骤2:在JdbcConfig上添加配置注解
JdbcConfig类要放入到com.test.config包下需要被Spring的配置类扫描到即可
Configuration
public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}步骤3:运行程序
依然能获取到bean对象并打印控制台。
这种方式虽然能够扫描到但是不能很快的知晓都引入了哪些配置类所有这种方式不推荐使用。
2.3.2 使用Import引入
方案一实现起来有点小复杂Spring早就想到了这一点于是又给我们提供了第二种方案。
这种方案可以不用加Configuration注解但是必须在Spring配置类上使用Import注解手动引入需要加载的配置类
步骤1:去除JdbcConfig类上的注解
public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}步骤2:在Spring配置类中引入
Configuration
//ComponentScan(com.test.config)
Import({JdbcConfig.class})
public class SpringConfig {}注意: 扫描注解可以移除 Import参数需要的是一个数组可以引入多个配置类。 Import注解在配置类中只能写一次下面的方式是不允许的 Configuration
//ComponentScan(com.test.config)
Import(JdbcConfig.class)
Import(Xxx.class)
public class SpringConfig {}步骤3:运行程序
依然能获取到bean对象并打印控制台
知识点1Bean
名称Bean类型方法注解位置方法定义上方作用设置该方法的返回值作为spring管理的bean属性value默认定义bean的id
知识点2Import
名称Import类型类注解位置类定义上方作用导入配置类属性value默认定义导入的配置类类名当配置类有多个时使用数组格式一次性导入多个配置类
2.4 注解开发实现为第三方bean注入资源
在使用Bean创建bean对象的时候如果方法在创建的过程中需要其他资源该怎么办?
这些资源会有两大类分别是简单数据类型 和引用数据类型。
2.4.1 简单数据类型
2.4.1.1 需求分析
对于下面代码关于数据库的四要素不应该写死在代码中应该是从properties配置文件中读取。如何来优化下面的代码?
public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}2.4.1.2 注入简单数据类型步骤
步骤1:类中提供四个属性
public class JdbcConfig {private String driver;private String url;private String userName;private String password;Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}步骤2:使用Value注解引入值
public class JdbcConfig {Value(com.mysql.jdbc.Driver)private String driver;Value(jdbc:mysql://localhost:3306/spring_db)private String url;Value(root)private String userName;Value(password)private String password;Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;}
}扩展
现在的数据库连接四要素还是写在代码中需要做的是将这些内容提
取到jdbc.properties配置文件大家思考下该如何实现? 1.resources目录下添加jdbc.properties 2.配置文件中提供四个键值对分别是数据库的四要素 3.使用PropertySource加载jdbc.properties配置文件 4.修改Value注解属性的值将其修改为${key}key就是键值对中的键的值 2.4.2 引用数据类型
2.4.2.1 需求分析
假设在构建DataSource对象的时候需要用到BookDao对象该如何把BookDao对象注入进方法内让其使用呢?
public class JdbcConfig {Beanpublic DataSource dataSource(){DruidDataSource ds new DruidDataSource();ds.setDriverClassName(com.mysql.jdbc.Driver);ds.setUrl(jdbc:mysql://localhost:3306/spring_db);ds.setUsername(root);ds.setPassword(root);return ds;}
}2.4.2.2 注入引用数据类型步骤
步骤1:在SpringConfig中扫描BookDao
扫描的目的是让Spring能管理到BookDao,也就是说要让IOC容器中有一个bookDao对象
Configuration
ComponentScan(com.test.dao)
Import({JdbcConfig.class})
public class SpringConfig {
}步骤2:在JdbcConfig类的方法上添加参数
Bean
public DataSource dataSource(BookDao bookDao){System.out.println(bookDao);DruidDataSource ds new DruidDataSource();ds.setDriverClassName(driver);ds.setUrl(url);ds.setUsername(userName);ds.setPassword(password);return ds;
}引用类型注入只需要为bean定义方法设置形参即可容器会根据类型自动装配对象。
步骤3:运行程序 3注解开发总结 后记 美好的一天到此结束下次继续努力欲知后续请看下回分解写作不易感谢大家的支持