目录
1、注解开发定义Bean(@Component/@Controller/@Service/@Repository)
知识点1:@Component/@Controller/@Service/@Repository
2、纯注解开发中的配置类(@Configuration/@ComponentScan)
3.2、Bean的生命周期 (@PostConstruct/@PreDestroy)
4.4、注解读取properties配置文件(@PropertySource)
Spring在3.0版已经支持纯注解开发,不再需要applicationContext.xml配置文件。创建一个springConfig的配置类。
1、注解开发定义Bean(@Component/@Controller/@Service/@Repository)
在实现类上添加@Component注解(BookDaoImpl为例)
@Component
public class BookDaoImpl implements BookDao {
public void save(){
System.out.println("book dao save.....");
}
}
注意:@Component注解不可以添加在接口上,因为接口是无法创建对象的
说明:
- BookServiceImpl类没有起名称,所以在App中是按照类型来获取bean对象
- @Component注解如果不起名称,会有一个默认值就是当前类名首字母小写,所以也可以按照名称获取
- 对于@Component注解,还衍生出了其他三个注解@Controller、@Service、@Repository ,方便我们后期在编写类的时候能很好的区分出这个类是属于表现层、业务层还是数据层的类。
知识点1:@Component/@Controller/@Service/@Repository
2、纯注解开发中的配置类(@Configuration/@ComponentScan)
(1)表示该类为配置类(@Configuration)
@Configuration
public class SpringConfig {
}
(2)用注解代替代替包扫描配置
@Configuration
@ComponentScan("com.AT")
public class SpringConfig {
}
@ComponentScan({com.AT.service","com.AT.dao"})
知识点2:@Configuration
知识点3:@ComponentScan
3、注解开发Bean作用范围与生命周期管理
3.1、Bean的作用范围(@Scope)
想要bookDaoImpl变成非单例,只需要在其类上添加@scope注解
@Component
@Scope("prototype")
public class BookDaoImpl implements BookDao {
public void save(){
System.out.println("book dao save.....");
}
}
知识点4:@Scope
3.2、Bean的生命周期 (@PostConstruct/@PreDestroy)
@Repository
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
@PostConstruct //在构造方法之后执行,替换 init-method
public void init() {
System.out.println("init ...");
}
@PreDestroy //在销毁方法之前执行,替换 destroy-method
public void destroy() {
System.out.println("destroy ...");
}
}
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency
知识点5:@PostConstruct
知识点6:@PreDestroy
小结:
4、注解开发依赖注入(自动装配)
4.1、注解实现按照类型注入(@Autowired)
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
注意:
- @Autowired可以写在属性上,也可也写在setter方法上,最简单的处理方式是写在属性上并将setter方法删除掉
- 为什么setter方法可以删除呢?
- 自动装配基于反射设计创建对象并通过暴力反射为私有属性进行设值
- 普通反射只能获取public修饰的内容
- 暴力反射除了获取public修饰的内容还可以获取private修改的内容
- 所以此处无需提供setter方法
4.2、注解实现按照名称注入(@Qualifier)
@Service
public class BookServiceImpl implements BookService {
@Autowired
@Qualifier("bookDao1")
private BookDao bookDao;
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
}
4.3、简单数据类型注入(@Value)
@Repository("bookDao")
public class BookDaoImpl implements BookDao {
@Value("AT")
private String name;
public void save() {
System.out.println("book dao save ..." + name);
}
}
4.4、注解读取properties配置文件(@PropertySource)
步骤1:resources下准备properties文件
name=At
步骤2:使用注解加载properties配置文件
@Configuration
@ComponentScan("com.itheima")
@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);
}
}
注意:
- 如果读取的properties配置文件有多个,可以使用@PropertySource的属性来指定多个
@PropertySource({"jdbc.properties","xxx.properties"})
- @PropertySource注解属性中不支持使用通配符* ,运行会报错
@PropertySource({"*.properties"})
- @PropertySource注解属性中可以把classpath:加上,代表从当前项目的根路径找文件
1 @PropertySource({"classpath:jdbc.properties"})
知识点7:@Autowired
知识点8:@Qualifier
知识点9:@Value
知识点10:@propertySource
5、IOC/DI注解开发管理第三方bean
我们就需要有一种更加灵活的方式来定义bean,这种方式不能在原始代码上面书写注
解,一样能定义bean,这就用到了一个全新的注解@Bean。
5.1、注解开发管理第三方bean(以druid为例)
步骤1:导入相应的jar包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.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 {
@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;
}
}
知识点11:@Bean
5.2、引入外部配置类
对于数据源的bean,我们新建一个JdbcConfig配置类,并把数据源配置到该类下
public class JdbcConfig {
@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)使用包扫描引入,需要在JdbcConfig上加入@Configuration注解(在springConfig中使用@ComponentScan进行引入)
(2)使用@Import引入,不需要在JdbcConfig上加入@Configuration注解
在Spring配置类中引入
@Configuration
@Import({JdbcConfig.class})
public class SpringConfig {
}
注意:
- 扫描注解可以移除
- @Import参数需要的是一个数组,可以引入多个配置类。
- @Import注解在配置类中只能写一次