Java练习(八):Spring应用之常见注解的简单应用 (@Component, @Autowired, @Value等)

目录

1. 背景概念

1.1 定义

1.2 常见注解

2. 简单的StudentComponent工程,展示常见注解的应用(@Component, @Value, @Autowired)

2.1 maven系统的配置文件:pom.xml

2.2 bean的配置文件: bean_component.xml

2.3 业务类:StudentComponent.java, TeacherComponent.java

2.4 测试类:StudentComponentTest.java

1. 背景概念

1.1 定义

(1)思考问题:

传统Spring的做法是使用xml文件来对bean进行注入或配置AOP, 事务。

这么做有两个缺点:

缺点一:如果所有的内容都配置在xml文件中,那么xml文件将会十分庞大。如果按需求分开xml文件,那么xml文件又会很多。配置文件的可读性和可维护性很低。

缺点二:在开发中在java文件和xml文件之间不断切换,很麻烦,降低开发效率。                       

(2)解决方案:

为了解决这个问题,Spring引入了注解。通过“@XXX”方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性和内聚性。
 

1.2 常见注解

(1)@Component

配置扫描哪些包下的注解。

指定注解扫描包 :<context: component-scan base-package="com.my.demo" />

在指定包下编写类,增加注解。

注意:这里在xml配置文件中并没有配置bean的信息,通过@Component("user")让spring自动寻找User类。

import org.springframework.bean.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("user")         //相当于<bean id="user" class="com.my.demo.User" />
public class User{
    @Value("Sheryl")        //相当于<property name="name" value="Sheryl" />
    public String name;
}

(2)@Value

为属性注入值(放在属性上)

支持如下方式的注入:

        注入普通字符

        注入操作系统属性

        注入表达式结果

        注入其他bean属性

        注入文件资源

        注入网站资源

        注入配置文件

(3)@Autowired

@Autowired注入注解。

是按类型自动装配的,不支持id匹配。

常用来在一个类中,引用其他类,并声明该其他类的实例对象,用于后续使用这些对象。

需要导入包:Spring-aop。

配置文件中设置 <context:annotation-config />

@Autowired(required=false) 说明:false, 对象可为null;true, 对象必须存对象,不能为null

(4)@Qulifier

@Qualifier注入注解

@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配。

不能单独使用。

(5)@Resource

是J2EE提供的,需导入包: javax.annotation.Resource;

@Resource如有指定的name属性,先按该属性进行ByName方式查找装配;其次再进行默认的ByName方式进行装配。

---如果以上都不成功,则按byType的方式自动装配。

---都不成功,则报异常。

补充:在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关。如果没有明确指定名称,则默认名称是从字段名称或设置方法(get、set方法)派生的。 如果用在字段上,则采用字段名称; 如果用在在setter方法,它采用其属性名称(例如getProperty()方法,取property做为属性名称)。

2. 简单的StudentComponent工程,展示常见注解的应用(@Component, @Value, @Autowired)

2.1 maven系统的配置文件:pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.my.test</groupId>
  <artifactId>SpringComponentDemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
   <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.3</version>
        </dependency>        
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>
    </dependencies>

</project>

2.2 bean的配置文件: bean_component.xml

注意:这里在xml配置文件中并没有配置bean的信息,简化了这个配置文件。而是在Java文件中通过@Component("user")让spring自动寻找Student类等。

<?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"
    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">
 
 <context:component-scan base-package="com.my.test"/>  
  
</beans>  

2.3 业务类:StudentComponent.java, TeacherComponent.java

(1)StudentComponent.java类

package com.my.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("student666")
public class StudentComponent {
    
    @Value("Lucky")
    private String name;
    
    @Autowired
    private TeacherComponent teacherComponent;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public TeacherComponent getTeacherComponent() {
        return teacherComponent;
    }
    public void setTeacherComponent(TeacherComponent teacherComponent) {
        this.teacherComponent = teacherComponent;
    }

}

(2)TeacherComponenent.java类

package com.my.test;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("teacher666")
public class TeacherComponent {
    
    @Value("Sheryl88")
    private String name;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }    
}

2.4 测试类:StudentComponentTest.java

package com.my.test.demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.my.test.StudentComponent;
import com.my.test.TeacherComponent;

public class StudentComponentTest {

    public static void main(String[] args) {
        //获取spring上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("bean_component.xml");
        //从spring上下文对象中,获取实例
        StudentComponent student = (StudentComponent) context.getBean("student666");
        TeacherComponent teacher = (TeacherComponent) context.getBean("teacher666");
        //打印实例,第一个语句中,student中引用teacher实例,这个加载实例的动作由spring来做,而不是像往常那样student自己new
        System.out.println("学生是:"+student.getName()+"。 老师是:"+student.getTeacherComponent().getName());  
        System.out.println("老师是:"+teacher.getName());  
    }

}

输出结果:

学生是:Lucky。 老师是:Sheryl88
老师是:Sheryl88

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值