【Spring笔记四】Spring中的Bean(注解配置)

在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这个包中进行扫描

<context:component-scan base-package="com.how2java"/>

对于扫描到的 Bean,在 Spring 中也有默认的命名策略;也就是如果注解没有标识 Bean 的名字,就默认使用类名首字母小写作为 Bean 的名字,也可以在注解中通过 value 属性值标识 Bean 的名称。如:@注解名(value=”名字”) 也可以这样写:@注解名(“名字”)

一个简单的例子说明注解配置

对前一节的例子进行修改

开启注解扫描,把category的的注入 注释掉

<context:component-scan base-package="com.how2java"/>
    <bean name="c" class="com.how2java.pojo.Category">
        <property name="name" value="category 1" />
    </bean>
    <bean name="p" class="com.how2java.pojo.Product">
        <property name="name" value="product1" />
       <!--  <property name="category" ref="c" />  -->
    </bean>

在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());
    }
}

@Autowired的位置

使用@Resoure来装配,修改Product类,一样运行没问题

@Resource(name="c")
private Category category;

 @Resource

可不可以再简化一点,当然没问题 

将xml文件所有Bean去掉,只留下

<context:component-scan base-package="com.how2java"/>

为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~

@Resource

 这个只是我自己测试的例子,如果体验不佳。。。更详细的例子可以参考上面贴的地址。

关于注解装配和XML装配哪个好,看这篇文章吧

https://blog.csdn.net/weixin_40341116/article/details/80939194

猜你喜欢

转载自blog.csdn.net/weixin_41866960/article/details/83959338