基于注解的方式配置Bean和装配Bean的属性

java是跨平台语言,而xml是跨平台的数据交换格式,所以在一开始java框架都不约而同地使用xml作为配置文件,时至今日,收到Rails框架的启发,主流的java框架都开始使用注解的方式代替xml配置文件。

既然不再使用xml来以一一配置容器中的Bean实例,那么就是希望spring能够自动搜索java类,并将这些java类注册成为Bean实例。那么Spring怎么知道注册哪些java类呢,这还是需要在xml中提供scan的路径,spring会对scan的包下和其子包下搜索加上注解的java类,并进行注册。

Spring提供了如下几个annotation来标注Spring Bean:

@Component@Controller @Service@Repository

从字面上就可以理解分别是标注:普通类 控制器组件类 业务逻辑组件类DAO组件类


Spring的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">


<!-- 指定Spring IOC容器扫描的包-->
<context:component-scan base-package="com.dejun.spring.beans.annotation"></context:component-scan>
</beans>

如果仅希望扫描满足一定条件的类而不是包下所有的类,可以通过resource-pattern属性过滤特定类:

<context:component-scan base-package="com.dejun.spring.beans.annotation"

resource-pattern="autowire/*.class"/><!--仅扫描以autowire开头的类-->

<context:include-filter> 子节点表示要包含的目标类
<context:exclude-filter> 子节点表示要排除在外的目标类


配置好后,在需要注册的类上加@Component就可以了,Spring默认命名Bean的方式是把类名的首字母小写,也可给Component添加参数来手动命名:@Component(“dejun”)。如果没有指定Bean实例的作用域,默认是Singleton的,可以通过@scope("prototype");来修改。


使用@Autowired配置依赖:

构造器, 普通字段(即使是非 public), 一切具有参数的方法都可以应用@Authwired 注解
默认情况下, 所有使用 @Authwired 注解的属性都需要被设置. 当 Spring 找不到匹配的 Bean 装配属性时, 会抛出异常, 若某一属性允许不被设置, 可以设置 @Authwired 注解的 required 属性为 false
默认情况下, 当 IOC 容器里存在多个类型兼容的 Bean 时, 通过类型的自动装配将无法工作. 此时可以在 @Qualifier 注解里提供 Bean 的名称. Spring 允许对方法的入参标注 @Qualifiter 已指定注入 Bean 的名称
  @Authwired 注解也可以应用在数组类型的属性上, 此时 Spring 将会把所有匹配的 Bean 进行自动装配.
@Authwired 注解也可以应用在集合属性上, 此时 Spring 读取该集合的类型信息, 然后自动装配所有与之兼容的 Bean. 
@Authwired 注解用在 java.util.Map 上时, 若该 Map 的键值为 String, 那么 Spring 将自动装配与之 Map 值类型兼容的 Bean, 此时 Bean 的名称作为键值


使用@Resource配置依赖:

@Resource有一个name属性,是需要被注入的Bean实例的id,也可以缺省,缺省的话会使用实例名或者去掉set字串后首字母小写得到的字串。


import javax.annotation.Resource;


import org.springframework.stereotype.Controller;


import com.dejun.spring.beans.annotation.service.UserService;


@Controller
public class UserController {
@Resource
private UserService userService;

public void execute(){
System.out.println("UserController execute.....");
userService.add();
}
}


package com.dejun.spring.beans.annotation.service;


import javax.annotation.Resource;


import org.springframework.stereotype.Service;


import com.dejun.spring.beans.annotation.repository.UserRepository;


@Service
public class UserService {

@Resource
private  UserRepository userRepository;

public void add(){
System.out.println("UserService add.....");
userRepository.save();
}
}


package com.dejun.spring.beans.annotation;


import org.springframework.stereotype.Repository;


import com.dejun.spring.beans.annotation.repository.UserRepository;
@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository{


@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("UserRepository Save.....");

}

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值