一,注解开发定义Bean

如果不给名字,那么获取 bean 只能通过类型获取了。

@Repository 用的很少,因为基本上是整合 mybatis 进行开发的,故用 @Mapper 代替这个的注解的更多哦。
二,纯注解开发定义Bean
Spring3.0 升级了纯注解开发模式,使用 java 类替代配置文件,开启了 Spring 快速开发赛道。


2.1 Bean的管理(注解版)
2.1.1 获取Bean
默认情况下,Spring 项目启动时,会把 bean 都创建好放在 IOc 容器中,如果想要主动获取这些 bean,从ApplicationContext类中提供了如下方法获取 bean
-
根据 name 获取 bean
Object getBean(String name) -
根据 type 获取 bean
<T> T getBean(Class<T> requireType) -
根据 name 获取 bean(附带类型转换)
<T> T getBean(String name, Class<T> requireType)
2.1.2 Bean的作用范围
Spring 支持五种作用域,后三种在 web 环境才生效:
| 作用域 | 说明 |
|---|---|
| singleton | 容器内同名称的bean只有一个实例(单例)(默认) |
| prototype | 每次使用该bean时会创建新的实例(非单例) |
| request | 每个请求范围内会创建新的实例(web环境中,了解) |
| session | 每个会话范围内会创建新的实例(web环境中,了解) |
| application | 每个应用范围内会创建新的实例(web环境中,了解) |

Bean 默认是在 Spring 项目启动的时候就实例化了,但是 Spring 提供了当 bean 第一次使用的时候才开始实例化,这种叫延迟初始化,使用方法是在 Bean 类的上方加上@Lazy注解即可
2.1.3 Bean的生命周期

@PostConstruct 和 @PreDestroy 注解位于 java.xml.ws.annotation 包是 Java EE 的模块的一部分。J2EE 已经在 Java 9 中被弃用,并且计划在 Java 11 中删除它。
解决方法:添加依赖:
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
2.2 依赖注入(注解版)
2.2.1 根据类型自动装入

我们可以向上述代码一样将 @Autowired 直接加在属性上方进行依赖注入,也可以加在set 方法,构造方法上方进行依赖注入。
我们也可以按照 bena 的名字进行依赖注入:

2.2.2 注入配置文件的内容

注入配置文件,我们需要先,加载 Properties 文件,将数据注入

也可以注入数组,List,Set,只需要在配置文件中按照正常的写法即可。
name=t1,t2,t3,t4
private class di{
@Value("${name}")
private List<String> names;
}
2.2.3 根据bean的名字自动装入
@Resource 是 Java 中用于依赖注入的注解,主要由 JSR-250 规范定义。它通常用于 Java EE 环境,但在 Spring Framework 中也可以使用。@Resource 注解主要用于注入一个外部资源,例如 Bean、类、或者其它资源,功能类似于 Spring 的 @Autowired 注解,但有一些区别。
-
基本用法:
import javax.annotation.Resource; import org.springframework.stereotype.Component; @Component public class MyService { @Resource private AnotherService anotherService; // 业务逻辑方法 } -
可以使用
name属性来指定要注入的 Bean 的名称:import javax.annotation.Resource; import org.springframework.stereotype.Component; @Component public class MyService { @Resource(name = "specificService") private AnotherService anotherService; // 业务逻辑方法 } -
还可以使用
type属性来指定要注入的 Bean 的类型:import javax.annotation.Resource; import org.springframework.stereotype.Component; @Component public class MyService { @Resource(type = AnotherService.class) private AnotherService anotherService; // 业务逻辑方法 }
2.2.4 两个注入注解的区别
按名称 vs. 按类型:
@Resource默认按名称注入,可以通过name属性指定 Bean 名称。@Autowired默认按类型注入,如果有多个相同类型的 Bean,可以结合@Qualifier注解按名称注入。
JSR-250 标准 vs. Spring 特有:
@Resource是 JSR-250 标准的一部分,适用于 Java EE 环境和 Spring。@Autowired是 Spring 特有的注解,仅适用于 Spring 环境。
Optional 属性:
@Autowired可以通过required属性指定是否为必需依赖,默认是true。设置为false时,可以避免NoSuchBeanDefinitionException异常。@Resource没有required属性,但在 Spring 中,如果找不到对应的 Bean,也会抛出NoSuchBeanDefinitionException异常。
2.3 第三方Bean管理
2.3.1 管理第三方Bean

不推荐直接在 Spring 配置类中配置三方 Bean,这样会导致代码臃肿。推荐如下,单独抽取出来管理三方 Bean

然后我们有两种方式让配置生效:

推荐使用导入式,这样能一眼看出配置类的结构信息,使用扫描式会导致代码不清晰,不知道这个配置具体有什么。

2.3.2 为第三方Bean注入资源


这个注入是默认根据类型注入的,如果存在两个相同的类型,我们就需要在形参前面加上 @@Qualifier 来指定
@Bean
public DataSource getDataSource(@Qualifier("userDao") IUseDao dao) {
dao.saveUser();
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driverName);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}