在Spring中,尽管使用XML配置文件可以实现Bean的装配工作,但如果应用中有很多Bean时,会导致XML配置文件过于臃肿,给后续的维护和升级工作带来一定的困难。为此,Java从JDK1.5以后,提供了注解功能,Spring也提供对注解的全面支持,Spring 3中定义了一系列注解。
贴一篇好文:https://www.cnblogs.com/szlbm/p/5512931.html
@Component:可以使用此注解描述Spring中的Bean,但它只是一个泛化的概念,仅仅表示一个组件(Bean),并且可以用在任何层次。当组件不好归类的时候,我们可以使用这个注解进行标注。使用时只需要将该注解标注在相应类上即可。如果不指定Bean的名字,则按这个类的类名首字母小写作为Bean的名称。
@Controller:通常作用在控制层(如Struts2的Action),用于将控制层的类标识为Spring中Bean,功能与@Component相同。如果不指定Bean的名字,则按这个类的类名首字母小写作为Bean的名称。
@Repository:用于将dao层的类标识为Spring中Bean,功能与@Component相同。如果不指定Bean的名字,则按这个类的类名首字母小写作为Bean的名称。
@Service:用于将service层的类标识为Spring中Bean,功能与@Component相同。如果不指定Bean的名字,则按这个类的类名首字母小写作为Bean的名称。
注:@Component注解 是用来配置 Bean的 一个最基本的注解,最初设计它只是为了将类注入到 IOC容器中,后来为了标识不同的代码,才衍生出 @Service、@Controller、@Repository 这三个注解,所以这三个注解用于开发项目,它们是基于 @Component 基本注解之上的。
@Autowired:顾名思义自动装配,可以写在字段上,或写在字段的 set 方法上,默认按照Bean的类型,完成 Bean 的自动装配。默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false)
@Resoure:其作用和@Autowired一样,区别在于@Autowired 默认按照Bean的类型装配,而@Resoure默认按照Bean的名称进行装配
@Qualifier:与@Autowired注解配合使用,会将默认的按Bean类型装配修改为按Bean的名称装配,Bean的名称由@Qualifier的参数指定。
在使用注解配置时,Spring并不知道我们对哪些类进行了注解,所以得开启注解扫描,将注解了的类作为 Bean 添加进 IOC容器,下面这段代码意思是到 com.how2java这个包中进行扫描
对于扫描到的 Bean,在 Spring 中也有默认的命名策略;也就是如果注解没有标识 Bean 的名字,就默认使用类名首字母小写作为 Bean 的名字,也可以在注解中通过 value 属性值标识 Bean 的名称。如:@注解名(value=”名字”) 也可以这样写:@注解名(“名字”)
一个简单的例子说明注解配置
对前一节的例子进行修改
开启注解扫描,把category的的注入 注释掉
在Product.java的category属性前加上@Autowired注解
package com.how2java.pojo;
import org.springframework.beans.factory.annotation.Autowired;
public class Product {
private int id;
private String name;
@Autowired
private Category category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
Category类
public class Category {
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private int id;
private String name;
测试类
package com.how2java.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.how2java.pojo.Product;
public class TestSpring {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
Product p = (Product) context.getBean("p");
System.out.println(p.getName());
System.out.println(p.getCategory().getName());
}
}
使用@Resoure来装配,修改Product类,一样运行没问题
@Resource(name="c")
private Category category;
可不可以再简化一点,当然没问题
将xml文件所有Bean去掉,只留下
为Product类和Category类加上@Component注解,即表明此类是bean
@Component("p")
public class Product {
@Component("c")
public class Category {
因为配置从applicationContext.xml中移出来了,所以属性初始化放在属性声明上进行了
private String name="product 1";
private String name="category 1";
运行测试类,可以发现结果是一样的。。。
上面写了如果不给Bean指定名称,则按这个类的类名首字母小写作为Bean的名称,测试一下
修改Category
@Component
public class Category {
修改Product的代码,将Category指定为@Resoure装配,并带上Bean的名称
@Resource(name="category")
private Category category;
运行测试类,no problem~
这个只是我自己测试的例子,如果体验不佳。。。更详细的例子可以参考上面贴的地址。
https://blog.csdn.net/weixin_40341116/article/details/80939194