Spring注解的使用和组件扫描

  • 通过配置组件扫描,可以使得spring自动扫描package,而不必在spring的配置文件中逐一声明各个 <bean>

  • 在配置组件扫描时,指定的包是“根包”,即例如指定了 cn.tedu.spring
    ,spring不只会扫描这个包,还会扫描它的各个层级子包,例如: cn.tedu.spring.dao

  • 直接在spring的配置文件中开启组件扫描即可 <context:component-scan base-package="cn.tedu.spring"></context:component-scan>

  • 注意: 仅仅开启组件扫描 spring
    是不会自动管理bean的,而是自动的扫描 package
    ,要想自动管理bean,那么还需要配置注解

注解

  • 在类的声明上方添加 @Component
    注解,可以是的spring知道这个类是一个组件,需要进行管理,所以如过某个类需要被Spring管理,应该将这个类放在被扫描的包中,并且添加注解

  • 由Spring扫描到的组件(由 @Component
    注解标记的类),会由Spring自动设置 Bean Id
    ,值为将 类名首字母小写
    的名称,例如组件类的名称是 UserDao
    ,则配置的Bean的iduserDao
    ,如果需要自定义Bean,那么可以直接在注解中设置,比如 @Component("id")

前提

  • 一定要是在开启组件扫描的包下使用注解,否则将不会扫描到配置的注解

常用注解

  • 可以混用,暂时这几个注解没有差异,完全功能相同,但是我们还是要根据规则使用

  • @Component
    : 通用注解

  • @Service
    : 用于对业务逻辑类的注解(Service层)
  • @Controller
    : 用于对控制器类的注解
  • @Repository
    :用于对持久层处理类的注解(Dao层)
  • @Named
    :通用注解(不用)

  • 以上5个注解从实现目标和效果是等效的,但是基于方便理解代码的目的,应该按需使用,了;例如对名为 UserService
    类的,应该使用 @Service

其他注解

@Scope

  • 在类的声明语句上方添加这个注解,用于设置bean的作用域,比如 @Scope("prototype")
    表示非单例,默认是单例

@Lazy

  • 在单例模式下设置是否懒加载,例如 @Lazy("true")
    用于设置成懒加载
  • 在类的声明语句上方添加
  • 前面之前已经说过,在创建Bean的时候默认使用的是单例模式下的饿汉式的创建,即是在spring配置文件加载的时候创建

@PostConstruct

  • 将方法设置为生命周期的初始化方法
  • 设置初始化方法,直接在初始化方法的声明语句中添加即可
/**
 * 初始化方法: 应该是public的,无返回参数,无参数的
 */
@PostConstruct   //定义初始化方法,在构造方法之后执行
public void init(){
	System.out.println("初始化方法");
}

@PreDestroy(单例模式下才会销毁)

  • 在方法的声明语句上方使用,可以将这个方法设置为生命周期的销毁方法
@PreDestroy   //定义销毁方法
	public void destroy(){
		System.out.println("销毁方法");
	}

注入值

@Autowired (不推荐使用)

  • 在类中,在声明属性的上方添加 @Autowired
    ,用于标记该属性是自动装配值

  • 这种自动装配默认按照类型( byType
    )实现自动装配

  • 如果需要按照名称(byName)来自动装配,还需要使用 @Qualifier("userDao")
    来组合使用,注解中配置的名称是需要注入的值的 Bean-Id

  • UserDao
@Repository("userDao")
public class UserDaoImpl implements UserDao{
	public void reg() {
		System.out.println("reg");
	}
}
  • UserService
@Service
public class UserService{
	@Autowired
	@Qualifier("userDao")
	private UserDao userDao;
	public void reg(){
		userDao.reg();
	}
}

@Resource (推荐使用)

  • 在需要注入的属性的上方添加该注解
  • 默认先按照名称来自动装配的(byName),如果名称对应不上,那么按照类型(byType)进行匹配
@Resource   //这里会先自动匹配和属性名一样的Bean Id,如果没有匹配到,那么就按照类型进行匹配
private UserDao userDao;

  • 如果使用 @Resource(name="userDaoImpl")
    ,name属性指定的是 Bean Id
    ,添加了name属性,那么只是按照名称来装配,如果这个名称对应的Bean不存在,那么就注入失败
@Resource(name="userDaoImpl")   //这里只会匹配Bean Id为userDaoImpl的,如果匹配不上,那么报异常
private UserDao userDao;

@Value

  • 使用 @Value
    注解添加在属性的声明的上方,可以对属性注入值

  • 直接注入值

@Value("陈加兵")
private String name;
  • 在使用 @Value("#{beanId.属性名}")
    的注解时还可以使用Spring表达式
@Value(#{jdbc.url})
private String url;

原文 

https://chenjiabing666.github.io/2018/04/24/Spring注解的使用和组件扫描/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring注解的使用和组件扫描

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址