Skip to content

Commit

Permalink
deploy
Browse files Browse the repository at this point in the history
  • Loading branch information
staven630 committed Jul 13, 2021
1 parent d1c9238 commit 6ba625a
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

  @Autowired 注解可以使用在类构造器、属性和属性 Setter 方法甚至一般的方法上,也可以混合使用。

### 构造器中使用@Autowired
### Setter 方法中的@Autowired

  @Autowired 注解可以在 setter 方法上,会在方法中执行 byType 自动装配。

> User.java
Expand Down Expand Up @@ -51,6 +53,8 @@ public class UserMain {
}
```

  使用@Autowired 自动装配注解后,在 XML 中的配置不需要在处理依赖关系,只需要配置 Bean 实例即可。

> applicationContext.xml
```xml
Expand All @@ -65,42 +69,48 @@ public class UserMain {
<bean id="user" class="com.staven.anno.User" />
<bean id="userService" class="com.staven.anno.UserService" />
</beans>
```

&emsp;&emsp;@Autowired 可以使用在属性的 Setter 方法中,也可以用在一般的方法中。即使一般方法没有被调用,容器也会将依赖对象注入。

```
### 构造器中使用@Autowired

### 属性中使用@Autowired
> UserService.java
```java
public class UserService {
@Autowired
private User user;

public UserService() {
@Autowired
public UserService(User user) {
this.user = user;
}

public void say() {
user.sayHello();
}
}
```

### Setter 方法中的@Autowired
&emsp;&emsp;建议保持构造器的参数名和需要注入的依赖的 Bean 名称一致。

&emsp;&emsp;@Autowired 注解可以在 setter 方法上,会在方法中执行 byType 自动装配。
&emsp;&emsp;从 Spring4.3 开始,如果该 Bean 类只有一个构造器,且包含参数的状况下,不加@Autowired 注解,容器也会自动查找对象并注入。如果存在多个构造器,需要在其中一个构造器上添加@Autowired 注解。

### 属性中使用@Autowired

```java
public class UserService {
@Autowired
private User user;

@Autowired
public void setUser(User user) {
public UserService() {
this.user = user;
}

public User getUser() {
return user;
}
}
```

&emsp;&emsp;@Autowired 可以使用在任何作用域,无论是 public、protected 还是 private 修饰的属性上。

### required 属性

&emsp;&emsp;@Autowired 默认是 required 的,也就是被注解的依赖必须已经在容器中注册。如果没有,则抛出 UnsatisfiedDependencyException 异常,容器初始化失败。这和@Required 注解的效果是一致的,区别是@Required 是对 XML 文件中的配置依赖项进行检查,@Autowired 会自动在容器中查找依赖项并注入。使用了@Autowired 注解的构造器和 Setter 方法一般不再需要注解@Required
Expand All @@ -123,7 +133,11 @@ public void setFoo(@Nullable Foo foo) {
}
```

## @Primary
## Autowired 消除分歧

&emsp;&emsp;默认情况下,Spring 按类型解析@Autowired 条目。如果容器中存在多个相同类型的 bean,框架将抛出 ​​ 一个致命异常。为了解决这个冲突,我们需要明确地告诉 Spring 我们想要注入哪个 bean。

### @Primary

&emsp;&emsp;@Autowired 默认根据类来查找和注入容器中的对象,如果存在同一个类的多个 Bean 实例被容器管理的状况,在使用@Autowired 装配该类的依赖对象时会报 UnsatisfiedDependencyException 的异常,提示 expected single matching bean but found X,容器初始化失败。可以在该类的某个 Bean 的配置中设置该 Bean 作为依赖注入的主候选项解决此问题,对应 XML 配置和 Java 注解配置的方式分别为:

Expand All @@ -143,7 +157,7 @@ public User secondUser() {
}
```

## @Qualifier
### @Qualifier

&emsp;&emsp;使用@Qualifier@Autowired 根据 Bean 的名字来查找依赖对象,进行细粒度的配置。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,14 @@ public class TestMain {
&emsp;&emsp;@Bean 配置使用注意点:

1. @Bean 注解的方法不能是 private 或 final。
2. @Bean 注解在返回实例的方法上,如果未通过@Bean 指定 bean 的名称,摸摸人用于标注的方法名相同。
3. @Bean 注解默认作用域为单例 singleton 作用域,可通过@Scope("prototype")设置为原型作用域。
4. 既然@Bean 的作用是注册 bean 对象,那么完全可以使用@Component@Controller@Service@Ripository 等注解注册 bean,当然需要配置@ComponentScan 注解进行自动扫描。
5. @Bean 注解虽然也可以用在@Component 注解的方法或其他的普通方法中,但是使用在@Configuration 注解类中是更为常见和推荐的用法。
6. 使用在@Configuration 注解类中的@Bean 注解方法不能定义 Bean 间的依赖关系,如果定义在非@Configuration 注解类的依赖关系中,则有可能被当做一般的方法被调用,而不是用来作为 Bean 定义的方法。
2. @Bean 注解的方法需要有非空的返回类型,返回的对象就是注册 Bean 的对象。该注解只有在其方法对象的类被注册为 Bean 的状况下才有效(该 class 可以通过@Configuation@Component 或 XML 配置)。
3. @Bean 可以是使用 name 属性指定名称,value 属性指定别名。
4. @Bean 在执行@Bean 注解方法实例化 Bean 时,如果该方法有参数,则容器会根据参数查找 Bean 并作为依赖项进行注入,没好到,则容器启动失败。
5. @Bean 注解默认作用域为单例 singleton 作用域,可通过@Scope("prototype")设置为原型作用域。
6. 可以通过@Description 注解对该 Bean 做一些详细的描述。
7. 既然@Bean 的作用是注册 bean 对象,那么完全可以使用@Component@Controller@Service@Ripository 等注解注册 bean,当然需要配置@ComponentScan 注解进行自动扫描。
8. @Bean 注解虽然也可以用在@Component 注解的方法或其他的普通方法中,但是使用在@Configuration 注解类中是更为常见和推荐的用法。
9. 使用在@Configuration 注解类中的@Bean 注解方法不能定义 Bean 间的依赖关系,如果定义在非@Configuration 注解类的依赖关系中,则有可能被当做一般的方法被调用,而不是用来作为 Bean 定义的方法。

> TestConfiguration.java
Expand Down

0 comments on commit 6ba625a

Please sign in to comment.