Spring中存取Bean对象的相关注解

1.五大类注解

@Controller(控制器存储)

@Service(服务储存)

@Repository(仓库储存)

@Component(组件储存)

@Configuration(配置储存)


用法

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

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

 @Controller:

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

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

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

@Service:

代码:

读取Bean代码:

 @Repository:

代码:

读取Bean代码:

 @Component:

代码:

读取Bean代码:

 @Configuration:

代码:

读取Bean代码:

 2.方法注解:@Bean

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

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

 

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

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

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

获取Bean对象代码:

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

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

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

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

 

 

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

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

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

3获取Bean对象的三种方法

1.属性注入

2.setter方法注入

3.构造方法注入

1.属性注入

获取注入对象的代码:

结果:

 2.setter注入

 获取注入对象的代码:

结果:

 也能成功调用.

3.构造方法调用

  获取注入对象的代码:

结果也是正常的:

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

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

 获取注入对象的代码:

 

 结果:

 

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

 修改之后得到正确结果

:

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

属性注入:

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

缺点: 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的

 

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

与@Autowried的区别

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

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

3.2同类型有多个@Bean报错

 在另一个类中获取User对象

 运行之后:

 多个同类型@Bean解决办法

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

2.@Qualifier注解定义名称

 

 或者

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值