1.五大类注解

@Controller(控制器存储)

@Service(服务储存)

@Repository(仓库储存)

@Component(组件储存)

@Configuration(配置储存)

用法

首先要建立一Spring的项目,再创建一个相应的Controller类.

 然后在resources目录下的xml文件加入这句,其中引号中的路径要包函你想要存储的Bean对象.

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端

 @Controller:

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_02

 我们平常想在main方法中获取这个UserController对象都是用new关键字创建一个的,但Spring就不一样了,它是在程序运行加载好的基础上去取到加载好的对象的.

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_03

 在获取上下文之后就可以通过getBean()方法从IoC容器中获取到Bean对象了.

 其他的注解的用法也是一样的:

@Service:

代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_spring_04

读取Bean代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_05

 @Repository:

代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_06

读取Bean代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_构造方法_07

 @Component:

代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_08

读取Bean代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_spring_09

 @Configuration:

代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_10

读取Bean代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_11

 2.方法注解:@Bean

首先我们要有一个类,例如

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_12

然后在另一个 类中创建一个对象并存储到Spring容器中

 

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_13

 注意:@Bean标签必须配合类标签使用.

为什么@Bean必须配合类标签使用呢?

这是程序员在设计的时候考虑到搜索的效率而设计的,只有通过注解标识了哪些路径,Spring才认为被标记的路径中有可能有要存到容器中的Bean对象,Spring才会去搜索那些被标记的路径,不必全部路径都搜索一遍,这样就提高了效率,所以如果只标记方法注解,而没有类注解,Spring是不会来搜索这个类的,就更别提搜索它里面的方法了.

获取Bean对象代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_14

 但是假如在其他类下面也有一个方法名一样的方法那就有问题了.

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_15

 你会发现在main方法中只能取到一个固定的对象,无法取到另一个.

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_16

不管运行多少次,你取到的都是"李四"这个对象,无法拿到"张三".

这时候就要用到Bean的重命名方法了

java中spring通过注解读取bean的配置文件 spring注解获取bean_构造方法_17

 

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_18

 

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_19

 这样我们就能随心所欲的取到想要的对象了

除了上面的命名方式,我们还有另外两种方式

java中spring通过注解读取bean的配置文件 spring注解获取bean_构造方法_20

 但是Bean还有个问题,就是不能存储带参数的方法,因为在存储Bean对象的时候,我们没办法手动给它传参,所以无法存储进去,如果要传参可能得配合其他标签让他在存储的时候自动传参.

3获取Bean对象的三种方法

1.属性注入

2.setter方法注入

3.构造方法注入

1.属性注入

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_21

获取注入对象的代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_22

结果:

java中spring通过注解读取bean的配置文件 spring注解获取bean_spring_23

 2.setter注入

java中spring通过注解读取bean的配置文件 spring注解获取bean_构造方法_24

 获取注入对象的代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_25

结果:

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_26

 也能成功调用.

3.构造方法调用

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_27

  获取注入对象的代码:

java中spring通过注解读取bean的配置文件 spring注解获取bean_spring_28

结果也是正常的:

java中spring通过注解读取bean的配置文件 spring注解获取bean_spring_29

当当前类只有一个构造方法的时候@Autowired标签也能省略

java中spring通过注解读取bean的配置文件 spring注解获取bean_构造方法_30

但是当当前类有多个构造方法的时候 必须加一个,不然Spring就会报错

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_31

 获取注入对象的代码:

 

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_32

 结果:

 

java中spring通过注解读取bean的配置文件 spring注解获取bean_构造方法_33

 所以有多个构造方法至少要加一个:

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_34

 修改之后得到正确结果

:

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_35

 虽然三个都能注入,但都有不同的优缺点:

属性注入:

优点: 编码方便快捷,代码量少.

缺点: 1.可能只有Spring支持这种写法,把代码在别的框架上使用同样的代码可能会出错.代码通用性差.因为代码简短,滥用的成本低,被滥用的概率高.

2.不能注入不可变的对象,也就是被Java中被final修饰的对象.

Setter方法注入:

优点: 符合单一原则,一个Setter只针对一个对象.

缺点: 1.不能注入不可变的对象,也就是被Java中被final修饰的对象.

2.由于可以多次调用setter方法,所以注入的对象可能被改变.

构造方法注入:

优点:1.符合单一原则,因为一个构造方法只会调用一次,所以相同对象只会存储一次.

2.注入的对象会被完全初始化,因为构造方法是对象在建立之初就执行的,所以在执行的时候能将对象完全初始化.

3.通用性会更好,因为构造方法是属于JDK所支持的,其他两种注入方式IoC容器才支持的.

4.可以注入不可变对象,对final修饰的对象有两种初始化的方法,一种是在创建的时候直接毒赋值,一种是在构造方法里赋值,所以构造方法注入刚好满足这种情况.

  3.1@Resource注解

@Resource和@Autowried的使用方法都差不多,但是@Resource提供的方法更多

@Resource是可以直接替换@Autowried的

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_36

java中spring通过注解读取bean的配置文件 spring注解获取bean_spring_37

 

但是只能属性注入的方式和setter注入的方式能用,因为构造方法的执行时机与@Resource不同,构造方法在创建对象时就执行,但是@Resource注解的执行时机在构造方法之后.

java中spring通过注解读取bean的配置文件 spring注解获取bean_后端_38

与@Autowried的区别

 @Resource比@Autowried多了很多参数设置

java中spring通过注解读取bean的配置文件 spring注解获取bean_构造方法_39

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_40

除此之外@Resource是JDK自带的注解,而@Autowried来自Spring.

3.2同类型有多个@Bean报错

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_41

 在另一个类中获取User对象

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_42

 运行之后:

java中spring通过注解读取bean的配置文件 spring注解获取bean_java_43

 多个同类型@Bean解决办法

1.@Resource(name = "XXX")定义

2.@Qualifier注解定义名称

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_44

 

java中spring通过注解读取bean的配置文件 spring注解获取bean_搜索_45

 或者

java中spring通过注解读取bean的配置文件 spring注解获取bean_spring_46

 

java中spring通过注解读取bean的配置文件 spring注解获取bean_构造方法_47