Spring 学习笔记 - Part3

学习资源来自B站黑马程序员: https://www.bilibili.com/video/BV1Fi4y1S7ix/?p=20&share_source=copy_web&vd_source=c76bb3d6e0326c966bf1bf32db90eb22

注解开发

注解开发定义bean

1. 直接在类名上面添加注解, 使用 @Component() 定义 bean

1
2
3
4
5
6
7
@Component("bookDao")
public class BookDaoImpl implements BookDao{
@Override
public void save() {
System.out.println("book dao save");
}
}

2. 配置文件增加context命名空间,用命名空间扫描对应类的package

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context"

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

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd

">
<context:component-scan base-package="com.dao.impl"/>

</beans>

3. 主程序调用不变

1
2
3
4
5
6
7
public class App2 {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}

Spring提供@Component注解的三个衍生注解

  • @Controller:用于表现层bean定义
  • @Service:用于业务层bean定义
  • @Repository:用于数据层bean定义

纯注解开发

用java类代替Spring核心配置文件

1. 创建配置类,SpringConfig

其中 @Configuration 替代了之前xml文件里的基础配置。

@ComponentScan("com.dao.impl") 替代了之前xml文件里的扫描指令, <context:component-scan base-package="com.dao.impl"/>

1
2
3
4
@Configuration
@ComponentScan("com.dao.impl")
public class SpringConfig{
}

2. 主程序调用

1
2
3
4
5
6
7
8
9
public class AppForAnnotation {
public static void main(String[] args) {
// 加载配置类
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);

BookDaoImpl bookDao = (BookDaoImpl) ctx.getBean("bookDao");
bookDao.save();
}
}

@Configuration注解用于设定当前类为配置类

@ComponentScan注解用于设定扫描路径,此注解只能添加一次,多个数据请用数组格式,如:@ComponentScan({"com.service","com.dao"})

容器对象的获取:AnnotationConfigApplicationContext

依赖注入-自动装配

引用类型

一般使用@autowired 进行装配。如果有多个同类型,在类型的@Repository带上名称参数,@autowired@Qualifier("classname") 配合实现。

自动装配基于反射涉及创建对象,并暴力反射对应属性为私有属性初始化数据,因此无需setter方法。

  • 使用@Autowired注解开启自动装配模式(按类型)
1
2
3
4
5
6
7
8
9
10
11
12
@Servcie
public class BookServiceImpl implements BookService{
@Autowired
private BookDao bookDao;
public void setBookDao(BookDao bookDao){
this.bookDao=bookDao;
}
public void save(){
System.out.print("book service save ...");
bookDao.save();
}
}
  • 注意:自动装配基于反射设计创建对象并暴力反射对应属性初始化数据,因此无需提供setter()方法
  • 注意:自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
  • 使用@Qualifier注解开启指定名称装配bean
1
2
3
4
5
6
@Service 
public class BookServiceImpl implements BookService{
@Autowired
@Qualifier("bookDao")
private BookDao bookDAO;
}
  • 注意:@Qualifier注解无法单独使用,必须配合@Autowired注解使用

简单数据类型注入

基础类型

基础类型直接使用 @Value() 赋值。

读取外部参数

springconfig 文件中,增加@PropertySource({})中 括号内为参数文件路径,注入时使用 ${} 括号内填写参数文件中对应的变量名。

在定义的数据类型上放使用@Value("值")

  • 在SpringConfig类下,使用@PropertySource注解加载properties文件
1
2
3
4
@Configuration
@ComponentScan("com")
@PropertySource("classpath:jdbc.properties")
public class SpringConfig{}
  • 在给属性注入值时
1
2
@Value("${外部文件中定义的属性名}")
private String value;
  • 注意:路径仅支持单一文件配置,多文件请使用数组格式配置,不允许使用通配符*

管理第三方bean

写法一

  • 使用@Bean配置第三方bean
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class SpringConfig{
@Bean
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;
}
}
//不推荐

主程序调用

1
2
3
4
5
6
7
8
public class AppForAnnotation {
public static void main(String[] args) {
// 加载配置类
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
DataSource dataSource = ctx.getBean(DataSource.class);
System.out.println(dataSource);
}
}
  • 将独立的配置类加入核心配置
  • 方式一:导入式
1
2
3
4
5
6
7
8
public class JdbcConfig{
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
//相关配置
return ds;
}
}
  • 使用@Import注解手动加入配置类到核心配置,此注解只能添加一次,多个数据请用数组格式
1
2
3
4
@Configuration
@Import(JdbcConfig.class)
public class SpringConfig{
}

第三方bean依赖注入

  • 简单类型依赖注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class JdbcConfig{
@Value("com.mysql.jdbc.Driver")
private String dirver;
@Value("jdbc:mysql://localhost:3306/spring_db")
private String url;
@Value("root")
private String userName;
@Value("505489")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDatSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUserName(userName);
ds.setPassword(password);
return ds;
}
}
  • 引用类型依赖注入
1
2
3
4
5
6
7
@Bean
public DataSource dataSource(BookService bookService){
Sytstem.out.print(bookService);
DruidDataSource ds = new DruidDataSource();
//属性设置
return ds;
}
  • 引用类型注入只需要为bean定义方法设置形参即可,容器会根据类型自动装配对象