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注解定义名称
或者