Spring Bean 注解应用浅谈

Spring容器中描述bean的方式有两种:

1:基于xml方式。
2:基于注解方式。
现阶段基于注解方式描述Bean元素已经成为一种趋势。

Spring中常用的bean注解有:

1:    修饰Bean类型(将bean交给spring容器管理)

a)     @Component (描述通用性组件)

b)     @Controller (描述MVC中控制层组件)

c)     @Service (描述MVC 中业务层组件)

d)     @Repository(描述MVC中持久层组件)

说明:这些组件实现的功能是一样的,只是应用的业务场景不同

2:   指定Bean作用域以及生命周期方法

a)     @ Scope(描述bean的作用域)

b)     @ PostConstruct(描述生命周期开始要调用的初始化的方法)

c)     @ PreDestroy (描述生命周期结束时要调用的销毁的方法)

3:    自动装配注解(为属性注入值)

a)     @Autowire (一般修饰构造方法或set方法或属性,默认按类型装配)

b)     @Qualifier (配合Autowire注解,按名字进行装配,尤其是出类型相同的bean时,可以指定具体bean)

c)     @Resource (一般修饰set方法或属性,默认按名字装配)

注:无论默认按类型还是名字进行装配,在没有找到对应名字或类型对象时底层还可能转换机制.

Spring Bean 注解应用

在spring应用中假如使用注解描述bean,定义bean的依赖机制,首先需要配置类的扫描机制(扫描某个或多个包中的类),spring扫描到这个类以后,会检测类上是否有spring中定义的相关注解的描述(例如@Controller,@Service),假如有spring底层会通过反射构建此类型的对象,然后进行管理.

Bean对象声明注解应用

配置对指定包中类的的扫描

<context:component-scan base-package="com.jt"/>


定义Bean组件,并使用spring注解修饰

@Repository

publicclass SysUserDao {}


@Service

publicclass SysUserService {}


注:使用Spring注解修饰的类,默认bean的名字为类名并且首字母小写.

编写测试类从spring容器中获取相关Bean对象.


Bean对象作用域注解应用

Spring 管理的Bean一般都会指定一个作用域,借助注解指定时需要

使用@Scope,注解中常用值为singleton或者prototype.

@Scope("singleton")

@Repository

publicclass SysUserDao {

}


Bean对象生命周期方法注解应用

Spring管理的Bean对象都有生命周期,但不一定都有生命周期方法,假如有些Bean需要指定生命周期方法,基于注解实现时可以借助@PostConstruct@ PreDestroy,这个两个注解都属于JDK中的API,使用时需要注意版本问题

 

@Repository

publicclass SysUserDao{

    public SysUserDao() {

        System.out.println("SysUserDao()");

    }

    //备注:这个注解在jdk1.5是没有的

    /**借助此注解修饰的方法在对象初始化时执行*/

    @PostConstruct

    publicvoid init(){

        System.out.println("init");

    }

    /**借助此注解修饰的方法在对象销毁时执行*/

    @PreDestroy

    publicvoid destory(){

       System.out.println("destory");

    }

}


Bean对象自动装配注解应用

Spring 管理的Bean对象可以采用自动装配机制为属性赋值.基于注解方式进行自动装配,一般需要使用@Autowired,@Qualifier,@Resource这些注解.

 

1)     @Autowired 可以修饰属性,构造方法,set方法,默认依据类型(属性类型,参数类型)为属性注入值.假如Spring容器中有多个相同类型的值,会参考名字进行匹配查找(属性名,set方法名,构造方法参数名),假如名字有相同的则注入,没有相同的会注入失败.

2)     @Qualifier 配合@Autowired注解按名字为属性注入值.

3)     @Resource 可以修饰属性或set方法,默认依据名字(属性名,set方法名)为属性注入值.假如spring容器中有名字相同但类型不同的bean就会注入失败,当没有找到对应名字的bean对象,此时会依据类型再次进行查找,假如相同类型则

直接注入,当有多个相同类型可能会注入失败(假如是按set方法进行注入,依据方法名字没找到,还会按参数类型查找,对应类型有多个,还可能会按参数名查找,假如没找对应的,则注入失败).

 

例如:

 

@Service("userService")

publicclassSysUserService {

    @Autowired

    private SysUserDao sysUserDao;

    @Autowired

    @Qualifier("date1")

private Date logDate;

}

 

@Controller

publicclassSysUserController {

    //默认先按属性名进行依赖查找,找不到则按类型进行查找.

    @Resource(name="userService")

    privateSysUserService sysUserService;

    /*

    默认按set方法名先进行查找,找不到按类型查找

    @Resource

    public void setSysUser(SysUserServicesysUserService) {

        this.sysUserService = sysUserService;

    }*/

    public SysUserServicegetSysUserService() {

        returnsysUserService;

    }

}

============================================

一个直有程序猿能读懂的笑话,很经典的:

女朋友让程序员买包子,如果遇到卖西瓜的,就买一个。

结果就是,程序员买了一个包子回家。

为什么?因为他遇到了卖西瓜的。













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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值