Spring注解方式使用与注册bean

  • 这次使用注解来完成注入功能,首先我们先直接使用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)   //这里falsetrue代表如果注入失败false会报错,true会置为null,但是要结合Qualifer注解使用,否则falsetrue均会报错
    @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属性,怎样让导入的实例注入不同的属性,这是个值得思考的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值