目录
2. 简单的StudentComponent工程,展示常见注解的应用(@Component, @Value, @Autowired)
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