您的位置:首页 > 编程语言 > Java开发

Spring注解方式使用与注册bean

2015-09-18 13:19 579 查看
这次使用注解来完成注入功能,首先我们先直接使用bean,仍然是在容器里定义Bean,然后我们使用装配,首先装配的是Resource注解,这个注解是java自带的,需要指定注解路径。

<context:annotation-config />
<context:component-scan base-package="annotation"></context:component-scan>


可以标注要装配的bean名字,可以在属性上标记,也可以在setter上标记。

例如:

@Resource //默认按名字,也可以 @Resource("userDao1")去指定bean名字
private UserDao userDao;


@Resource //这里在setter上去标注
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}


Resource是先按照名字再按照类型去装配。

接下来是Autowired注解和Qualifier注解。

这两个注解是Spring支持的,Autowired用法基本与Resource一致,想指定具体的名字可以采用与Qualifier结合使用的方式,例如:

@Autowired(required=false)   //这里false和true代表如果注入失败false会报错,true会置为null,但是要结合Qualifer注解使用,否则false和true均会报错
@Qualifier("userDao1")
private UserDao userDao;
@Autowired
@Qualifier("userDao2")
public void setUserDao2(UserDao userDao2) {
this.userDao2 = userDao2;
}


可以在使用Autowried的bean里设置Autowired为使用名字还是使用类型去装配,例如刚才这些装配的代码均在UserService里的,UserService这个bean在容器里的配置可以如下:

<bean id="userService1" class="annotation.UserService" autowire="byName">//或则byType,如果有多个同样的type会报错
</bean>


注意这里就算使用了Autowried(required=false)和Qulifier依然会报错.这应该在判断类型之后,或则是Qulifier与byType产生冲突吧。

下面我们来处理如何用注解的方式去注册bean,首先我们将要扫描注册为bean的包放在spring配置文件里:

这样

<context:component-scan base-package="dao"></context:component-scan>
<context:component-scan base-package="service"></context:component-scan>


我们使用服务层的bean:

ApplicationContext context  = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService)context.getBean("us");
userService.test();


//这个Service本身也注册为一个名为us的bean
@Service("us") @Scope("singleton")
public class UserService {
@Resource(name="udl")//用Resource注解,指定了要装配bean的名字,这里的udl为UserDao接口的一个实现类的bean名字
private UserDao userDao1;
private UserDao userDao2;
public UserDao getUserDao1() {
return userDao1;
}
public void setUserDao1(UserDao userDao1) {
this.userDao1 = userDao1;
}
public UserDao getUserDao2() {
return userDao2;
}
//Autowired方法指定名字
@Autowired(required=false)
@Qualifier("udl")
public void setUserDao2(UserDao userDao2) {
this.userDao2 = userDao2;
}

@PostConstruct //指定初始化方法,使用本bean都会首先执行
public void initMethod()
{
System.out.println("---这是注解初始化的方法----");
}
//打印
public void test()
{
System.out.println("-------");
if(userDao1 != null)
{
userDao1.save();
}
System.out.println("-------");
if(userDao2 != null)
{
userDao2.save();
}
System.out.println("-------");
}
}


userDao实现类的bean注册:

@Service("udl")
public class UserDaoImpl implements UserDao {
/*
*
*/
}


Service , Controller,Compoent都可以指定bean名字,这是spring保留给不同的层使用的注解,如果不指定名字,bean的名字默认为注册类的名字(第一个字母改成小写)

UserDaoImpl还有个name属性,怎样让导入的实例注入不同的属性,这是个值得思考的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: