正常情况下我们在xml配置bean,但是我们为了减少xml配置,可以在类上使用一些特定注解向Spring容器表明这是一个需要注册的bean。常用的注解有@Configure、@Component、@Reposity、@Service、@Controller。
传统的在xml中装配bean的方式
<bean id="baishi" class="com.yqg.springannotation.BaiShi"></bean>
<bean id="kekou" class="com.yqg.springannotation.KeKou"></bean> <bean id="work" class="com.yqg.springannotation.Work"></bean>
使用包扫描,基于注解注册bean的方式,包含子包,注册的bean名称为类名首字母小写,如Student类,注册的名称为student
<context:component-scan base-package="com.yqg.springannotation"></context:component-scan>
二、使用注解注入依赖的bean
我们使用@Autowried、@resource这两个注解将bean注入,使用注解的好处是不用在配置文件中使用ref注入bean,不用在需要注入bean的类中使用get和set,代码简洁。但是有些类比如整合第三方类,我们不得不使用xml配置bean。
代码示例
xml部分配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="baishi" class="com.yqg.springannotation.BaiShi"></bean>
<bean id="kekou" class="com.yqg.springannotation.KeKou"></bean>
<bean id="work" class="com.yqg.springannotation.Work"></bean>
</beans>
一个接口以及两个实现类
package com.yqg.springannotation;
/**
* @author yqg
* @date 2019-02-15 21:31
*/
public interface Drink {
/**
* 测试Spring注解
*/
public void say();
}
package com.yqg.springannotation;
/**
* @author yqg
* @date 2019-02-15 21:32
*/
public class BaiShi implements Drink{
public void say() {
System.out.println("百事可乐");
}
}
package com.yqg.springannotation;
/**
* @author yqg
* @date 2019-02-15 21:33
*/
public class KeKou implements Drink{
public void say() {
System.out.println("可口可乐");
}
}
使用注解注入依赖的类Work
package com.yqg.springannotation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import javax.annotation.Resource;
/**
* @author yqg
* @date 2019-02-15 21:44
*/
public class Work {
public void work(){
baiShi.say();
keKou.say();
}
// public void work(){
// drink.say();
// }
@Autowired(required = false)
/**
* 百事可乐
*/
private BaiShi baiShi;
@Resource(name = "kekou")
private KeKou keKou;
// @Autowired
// @Qualifier(value = "baishi")
// private Drink drink;
}
测试类
package com.yqg.springannotation;
import com.yqg.util.ApplicationContextUtil;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
/**
* @author yqg
* @date 2019-02-15 21:38
*/
public class AnnotationTest {
@Test
public void test(){
ApplicationContext applicationContext = ApplicationContextUtil.getApplicationContext();
Work work = applicationContext.getBean("work",Work.class);
work.work();
}
}
@Resource和@AutoWried两者作用一样,但是两者也有差别
1.@Resource默认按照byName注册bean,如果没有就按类型,可以@Resource(name="")指定bean的名称,@Autowired默认按类型注入
2.@Resource是javaEE的注解,@Autowried是spring的注解,尽量使用@Resource,减少第三方代码耦合
@qualifier注解是解决是实现类不确定问题,比如一个接口多个实现类,我们将该接口注入,那么spring容器不能确定使用哪个实现类,我们可以使用@qualifier和@Autowried结合使用。
原文:https://www.cnblogs.com/yanqingguo/p/10386305.html