接上一章节:https://blog.csdn.net/weixin_58580280/article/details/120145452
一 @Bean与@Component联用,也可以提高编码效率

方案1:@Bean组件注入到@Component组件中
第一步:spring4工程利用@Bean在配置类Config中声明组件
package cn.tedu.context;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
@Configuration
@ComponentScan("cn.tedu.demo")//配置类扫描包,spring为其包下的类创建对象
public class Config {
@Bean
public Date currentDate(){
return new Date();
}
}
第二步:利用@Component声明组件,注入Date类型组件
package cn.tedu.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class Employee {
private String name="Tom";
@Autowired
private Date date;
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", date=" + date +
'}';
}
}
第三步:TestCase类中测试
@Test
public void testEmployee(){
/*测试 @Bean 声明的组件注入到 @Component声明的组件*/
Employee employee =ctx.getBean("employee",Employee.class);
System.out.println(employee);//Employee{name='Tom', date=Tue Sep 07 21:42:22 CST 2021}
}方案2:@Component 组件注入到@Bean 组件中 ,效果一样
第一步: demo包下创建Dept部门类,提供set方法和和toString()
package cn.tedu.demo;
public class Dept {
private String name = "Java教研部";
private Employee manager;
public void setManager(Employee manager) {
this.manager = manager;
}
@Override
public String toString() {
return "Dept{" +
"name='" + name + '\'' +
", manager=" + manager +
'}';
}
}
第二步: Config类添加部门对象,使@Component组件下的参数注入到@Bean组件的对象方法中
@Bean
public Dept dept(Employee employee){//参数是@Component组件下的参数
Dept dept = new Dept();
dept.setManager(employee);//通过参数把employee注入到manager中
return dept;
}第三步:测试效果,效果和方案1 一样
@Test
public void testDept(){
/*测试 @Component 声明的Bean组件注入到@Bean声明的组件中*/
Dept dept = ctx.getBean("dept", Dept.class);
System.out.println(dept);
Dept{name='Java教研部', manager=Employee{name='Tom', date=Tue Sep 07 22:38:16 CST 2021}}
}二 使用Properties文件
1 Druid 连接池

第一步: spring4工程pom文件添加druid数据库连接池依赖以及mysql连接驱动依赖
注意mysql连接依赖的版本
<!--数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!--数据库连接-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>第二步: Config类创建jdbc连接驱动,查询sql语句
@Bean(initMethod = "init",destroyMethod = "close")//标注初始化方法和销毁方法
public DataSource dataSource(){
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/mysql?" +
"characterEncoding=utf8&useSSL=false&serverTimezone=UTC&" +
"rewriteBatchedStatements=true");
ds.setUsername("root");
ds.setPassword("root");
ds.setMaxActive(10);
ds.setInitialSize(2);
return ds;
}第三步:TestCase包下测试,结果是: Hello World ! 说明连接数据库成功并查询数据成功
@Test
public void testDataSource(){
/* 测试数据库连接池是否能够成功连接到数据库*/
String sql = "select 'Hello World !'";
DataSource ds = ctx.getBean("dataSource", DataSource.class);
try(Connection conn = ds.getConnection()) {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString(1));
}
}catch (Exception e){
e.printStackTrace();
}
}总结:缺点就是连接数据库时的url设置繁琐,容易出错!
2 @PropertySource 注入 Environment 对象
程序参数经常保存到properties文件中,Spring提供了@PropertiesSource注解用于读取Properties文件,读取后保存到Environment 对象中,可以在程序中注入Environment 对象,就可以获得配置文件中的信息了.

第一步:resources包下编辑数据库配置文件,可从下图网址下载,解压后复制粘贴进resources包下


db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/mysql?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
db.username=root
db.password=root
db.maxActive=10
db.initialSize=2
第二步:Config配置类添加@PropertySource注解指定配置文件,通过注入到Environment对象进行使用
@Configuration
@PropertySource("classpath:jdbc.properties")//配置文件来源
public class Config {
@Autowired
Environment env;//配置文件注入到env对象中
@Bean(initMethod = "init",destroyMethod = "close")//此时初始化方法和销毁方法可写/可不写
public DataSource dataSource2(){
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName(env.getProperty("db.driver"));
ds.setUrl(env.getProperty("db.url"));
ds.setUsername(env.getProperty("db.username"));
ds.setPassword(env.getProperty("db.password"));
ds.setMaxActive(env.getProperty("db.maxActive",Integer.class));//字符串类型转为Integer类型
ds.setInitialSize(env.getProperty("db.initialSize",Integer.class));
return ds;
}
......第三步:测试@PropertySource注解能否读取到jdbc.properties文件,并连接数据库查询成功?
@Test
public void testDataSource2(){
/*测试 @PropertySource 读取 properties*/
String sql = "select 'Hello World !'";
DataSource ds = ctx.getBean("dataSource2", DataSource.class);
try(Connection conn = ds.getConnection()) {
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString(1));
}
}catch (Exception e){
e.printStackTrace();
}控制台:成功

3 @Value 读取系统环境Environment中的信息,注入到变量中,此方式更加灵活方便

第一步: Config配置类使用@PropertySource和@Value注解,将配置文件注入到@Value注解的方法
参数中
@Configuration
@PropertySource("classpath:jdbc.properties")//配置文件来源
public class Config {
@Bean
public DataSource dataSource3(
@Value("${db.driver}") String driver,
@Value("${db.url}") String url,
@Value("${db.username}") String username,
@Value("${db.password}") String password,
@Value("${db.maxActive}") int maxActive,
@Value("${db.initialSize}") int initialSize){
DruidDataSource ds=new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
ds.setMaxActive(maxActive);
ds.setInitialSize(initialSize);
return ds;
}
.....
}第二步:测试类编辑测试
@Test
public void testDataSource3(){
/*测试 @Value读取properties*/
String sql =" select 'Hello World!'";
DataSource ds = ctx.getBean("dataSource3", DataSource.class);
try(Connection conn=ds.getConnection()) {
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString(1));
}
} catch (Exception e) {
e.printStackTrace();
}
}