SpringBoot常⽤注解(⼆)-注⼊Bean的注解
1.概述
在 中学习了Spring Boot中声明Bean的注解
那Spring容器中的Bean是怎么实现⾃动装配(依赖)的呢?
这就是接下来学习的注⼊注解咯
注⼊Bean的注解:
@Autowired
@Inject
@Resource
resource和autowired注解的区别2.@Autowired注解
@Autowired注解源码:
package org.springframework.beans.factory.annotation;
/**
1. @since
2.5
2. @see AutowiredAnnotationBeanPostProcessor
3. @see Qualifier
4. @see Value
*/
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
1. @Autowired注解作⽤在构造函数、⽅法、⽅法参数、类字段以及注解上
2. @Autowired注解可以实现Bean的⾃动注⼊
2.1 @Autowired注解原理
在Spring Boot应⽤启动时,Spring容器会⾃动装载⼀个
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor处理器,当容器扫扫描到@Autowired注
解时,就会在IoC容器就会相应类型的Bean,并且实现注⼊。
2.2 @Autowired注解使⽤
在Web MVC中控制层(Controller)访问的是业务层(Service),⽽业务层(Service)访问的是数据层(Dao),使⽤@Autowired注解
实现注⼊
数据层:
ample.demo.chapter1.useannotation.autowired.dao;
/**
* 数据层接⼝,⽤于访问数据库,返回数据给业务层
* */
public interface IDao {
public String get();
}
/**
* 数据层接⼝实现类
*
* 1.数据层Bean⽤@Repository标注
* 2.当前Bean的名称是"autowiredUserDaoImpl"
* 3.设置当前Bean的为原型模式,即每次获取Bean时都创建⼀个新实例
* */
@Repository("autowiredUserDaoImpl")
@Scope("prototype")
public class UserDaoImpl implements IDao {
public String get() {
return"@Autowired注解实现⾃动装配";
}
}
业务层:
ample.demo.chapter1.useannotation.autowired.service;
/**
* 业务层接⼝
* 从数据层获取数据,处理结果返回给控制层
* */
public interface IService {
public String get();
}
/**
* 业务层接⼝实现
*
* 1.数据层Bean⽤@Service标注
* 2.当前Bean的名称是"autowiredUserServiceImpl"
* 3.设置当前Bean的为原型模式,即每次获取Bean时都创建⼀个新实例
* 4.业务层有⼀个数据层接⼝IDao,使⽤@Autowired注解标注
* */
@Service("autowiredUserServiceImpl")
@Scope("prototype")
public class UserServiceImpl implements IService {
/**
* @Autowired实现⾃动装配
* Spring IoC容器扫描到@Autowired注解会去查询IDao的实现类,并⾃动注⼊
* */
@Autowired
private IDao dao;
@Override
public String get() {
();
}
}
1. Bean通过注解@Service声明为⼀个Spring容器管理的Bean,Spring容器会扫描classpath路径下的所有类,到带有@Service注
解的UserServiceImpl类,并根据Spring注解对其进⾏初始化和增强,命名为autowiredUserServiceImpl
2. Spring容器如果发现此类属性dao也有注解@Autowired,则会从Spring容器中查⼀个已经初始化好的IDao的实现类,如果没有
到,则先初始化⼀个IDao实现类
控制层:
测试结果:
1. 启动Spring Boot应⽤
2. 浏览器输⼊:http:localhost:8080/autowiredController
3. 返回结果:
2.3 @Qualifier 注解@Qualifier注解源码:
package com .example.demo.chapter 1.ller ;
import org .springframework.beans.factory.annotation.Autowired ;
import org .springframework.web.bind.annotation.RequestMapping ;
import org .springframework.web.bind.annotation.RestController ;
import com .example.demo.chapter 1.useannotation.autowired.service.IService ;
/**
1. 控制层
2.
3. 1.控制层使⽤@RestController 注解标注,返回json 格式的字符串
4. 2.获取业务层返回的数据,输出到客户端
5. 3.请求:http:localhost:8080/autowiredController
6. */
@RestController
public class AutowiredController {
@Autowired
private IService service ;
@RequestMapping("/autowiredController")
public String get () {
return service .get ();
}
}
package org.springframework.beans.factory.annotation;
/**
* @since 2.5
* @see Autowired
*/
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Qualifier {
String value() default"";
}
1. 如果Spring 容器中有两个数据层接⼝IDao的实现类
2. ⽽业务层通过@Autowired注解标注的是IDao接⼝
3. 这时就需要@Qualifier注解来指定需要⾃动装配的Bean的名称
4. 否则会报如下的错:
Description:
Field dao ample.demo.chapter1.useannotation.autowired.service.UserServiceImpl required a single bean, but 2 were found:
- autowiredAdminDaoImpl: defined in file [D:\eclipse\workspace\boot\demo\target\classes\com\example\demo\chapter1\useannotation\autowired
- autowiredUserDaoImpl: defined in file [D:\eclipse\workspace\boot\demo\target\classes\com\example\demo\chapter1\useannotation\autowired\dao Action:
Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be c 2.4 @Qualifier注解使⽤
数据层接⼝IDao:
public interface IDao {
public String get();
}
IDao实现类 - UserDaoImpl
@Repository("autowiredUserDaoImpl")
@Scope("prototype")
public class UserDaoImpl implements IDao {
public String get() {
return"@Autowired注解实现⾃动装配 - UserDaoImpl";
}
}
IDao实现类 - AdminDaoImpl
@Qualifier注解使⽤:
测试结果:
2.4 @Autowired 注解的requird 属性
在使⽤@Autowired注解时,⾸先在容器中查询对应类型的bean
1. 如果查询结果Bean刚好为⼀个,⾃动注⼊
2. 如果查询结果Bean不⽌⼀个,通过@Qualifier注解指定⾃动装配Bean的名称
3. 如果没有查询到对应类型的Bean,由于默认@Autowired(required=true),会抛出异常,解决⽅法是使⽤
@Autoiwired(quired=false)
4. @Autowired(quired=true)意味着依赖是必须的
5. @Autowired(quired=false)等于告诉 Spring:在不到匹配 Bean 时也不报错数据层接⼝:
@Repository ("autowiredAdminDaoImpl")
@Scope ("prorotype")
public class AdminDaoImpl implements IDao {
@Override
public String get () {
return "@Autowired 注解实现⾃动装配 - AdminDaoImpl";
}}
@Service ("autowiredUserServiceImpl")
@Scope ("prototype")
public class UserServiceImpl implements IService {
/**
* @Autowired 实现⾃动装配
* Spring IoC 容器扫描到@Autowired 注解会去查询IDao 的实现类,并⾃动注⼊
* */
@Autowired
@Qualifier ("autowiredUserDaoImpl")
private IDao dao;
@Override
public String get () {
return ();
}}
package ample.demo.chapter1.useannotation.autowired.dao;
/**
* 数据层接⼝
* */
public interface ITask {
public String get ();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论