利用注解的方式注入属性,大大减少了代码量,使代码看起来更加的简洁,但是也对我们代码的开发者提出了更为严格的要求,要求我们了解注解的作用,深层次了解注解给我们省去哪些代码量。
在使用注解开发之前,先要引入context的头文件,另一个是要开启注解的支持,:
<!--头文件-->
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
<!--开启注解支持-->
<context:annotation-config/>
<context:annotation-config作用:
- 进行注解驱动注册,从而使注解生效
- 如果没有扫描包,就需要进行手动配置bean
- 如果不加注解驱动,则注入的值为null
注解分类:
一.@Autowired和@Qualifier
- @Autowired需要导入spring-aop的包
- @Autowired是按类型自动转配的,不是按id匹配
- 配合@Qualifier则可以根据byName的方式自动装配
- @Qualifier不能单独使用
程序演示:
1.编写实体类,(注意无set方法),并且使用@Autowired注解
public class Cat {
public void shout(){
System.out.println("喵喵喵");
}
}
public class Dog {
public void shout(){
System.out.println("汪汪汪");
}
}
public class People {
private String name;
@Autowired
@Qualifier(value = "cat333")
private Cat cats;
@Autowired
@Qualifier(value ="dog333")
private Dog dogs;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Cat getCats() {
return cats;
}
public void setCats(Cat cats) {
this.cats = cats;
}
public Dog getDogs() {
return dogs;
}
public void setDogs(Dog dogs) {
this.dogs = dogs;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", cats=" + cats +
", dogs=" + dogs +
'}';
}
}
2.配置beans.xml文件:
@Qualifier注解的内容应该与bean中配置的id内容相一致或者bean中id应该与类中对象名称保持一致,两者可以配合使用。
<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<context:annotation-config/>
<bean id="cat" class="Cat"/>
<!--配置文件修改内容,保证类型存在对象,且名字不为类的默认名字-->
<bean id="cat333" class="Cat"/>
<bean id="dog" class="Dog"/>
<!--配置文件修改内容,保证类型存在对象,且名字不为类的默认名字-->
<bean id="dog333" class="Dog"/>
<bean id="person" class="People"/>
</beans>
3.测试:
public class MyTest {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("beams.xml");
People people = context.getBean("person",People.class);
people.getCats().shout();
people.getDogs().shout();
}
}
结果:
上述结果表示,即使配置bean中的id与类对象不一致,同样可以通过注解@Qualifier进行自动匹配,但是前提是开启注解支持。
二:@Resource
- @Resource如有指定的name属性,先按该属性进行byName方式进行装配
- 其次再进行默认的byName方式进行装配
- 如过以上都不成功,则按byType的方式自动装配
- 都不成功的话,则报异常。
程序演示:
1.实体类:
public class User {
//如果允许对象为null,设置required = false,默认为true
@Resource(name = "cat2")
private Cat cat;
@Resource
private Dog dog;
private String str;
}
2.配置xml文件
<bean id="dog" class="Dog"/>
<bean id="cat1" class="Cat"/>
<bean id="cat2" class="Cat"/>
<bean id="user" class="User"/>
则结果ok,与上述结果一致。
做出以下相应改变:
配置文件中,删掉cat2的bean:
<bean id="dog" class="Dog"/>
<bean id="cat1" class="Cat"/>
实体类只保留注解,不设置value的值:
@Resource
private Cat cat;
@Resource
private Dog dog;
测试发现,结果不变,与上述一致。则表示先进性byName查找,若失败,则进行byType查找,而@Autowired先是byType查找。
三:Bean的实现:
1.配置扫描特定包下的注解:
<context:component-scan base-package="wang.pojo"/>
2.在指定包下编写类,增加注解
@Conponent:将这个类标注成Spring的一个组件,放到容器中。
@Conponent("user")
//相当于xml文件中<bean id="user" class="特定类"/>
public class User(){
private String name="王军";
}
若没有提供set方法,使用@value(“值”)一样达到效果:
@Conponent("user")
public class User(){
//相当于配置文件中<property name="name" value="王军"/>
@Value("王军")
private String name;
}
若提供了set方法,则将注解使用在set方法处就行。
@Bean:
新建一个config配置包,编写一个MyConfig配置类:
@Configuration //代表这是一个配置类
public class MyConfig {
@Bean //通过方法注册一个bean,这里的返回值就Bean的类型,方法名就是bean的id!
public Dog dog(){
return new Dog();
}
}
四:三个衍生注解
1.@Controller:web层
2.@Service:service层
3.@Repository:dao层
在各层写上这些注解代表类将交由Spring统一管理装配。
总结:
xml与注解比较:
1.xml适用于任何场景,结构清晰,维护方便。
2.注解只能在自己提供的类上使用,开发简单方便。
xml与注解同时使用是目前最好的开发方式,一方面利用xml文件管理bean,另一方面,利用注解完成类中属性的注入。