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
写法一
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定义方法设置形参即可,容器会根据类型自动装配对象