Bean
- 配置
- 注解
- @Autowired 注解
- context:component-scan 标签
配置
在 Spring 中,配置 bean 实例一般使用 xml 配置方式或注解(Annontation) 方式进行配置。
注解
注解(Annontation),是在原有代码和逻辑下通过 @XXX 的方式进行 bean 配置,简化了 xml 配置文件的同时,提高了 Java Bean 的可读性与内聚性。
注解 | 说明 |
---|---|
@Component | 相当于配置文件的 bean 标签,一般使用在类上 |
@Service | 与@Component作用相同,但一般使用在 service 层 |
@Controller | 与@Component作用相同,但一般使用在 controller 层 |
@Repository | 与@Component作用相同,但一般使用在 dao 层 |
@Value() | 给属性赋值 |
@Resource | 相当于配置文件的 ref 属性,给对象赋值 |
@Scope | 相当于配置文件的 scope 属性 |
@PostConstruct | 相当于配置文件的 init-method 属性 |
@PreDestroy | 相当于配置文件的 destory-method 属性 |
@Autowired | 自动装配 |
简单示例:
首先,在 xml 配置文件中必须配置 context:component-scan 标签:
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注:必须配置该配置项 -->
<!-- 开启 spring 注解,base-package 属性指定扫描注解的类的所在包 -->
<context:component-scan base-package="cn.edu.springdemo" />
</beans>
然后创建一个数学类,通过注解给其属性赋值:
package cn.edu.springdemo.annontationDemo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component(value = "mathAnnontation") // id 默认为类名,开头字母小写
public class MathAnnontation {
@Value(value = "20230515")
private int id;
@Value("数学") //当只有一个值时,value 可省略
private String math;
public int getId() {
return id;
}
public String getMath() {
return math;
}
//也可以将配置放置在对应的 set 方法位置(区别:配置在属性上是使用反射赋值;配置在 set 方法上是调用 set 方法赋值)
public void setId(int id) {
this.id = id;
}
public void setMath(String math) {
this.math = math;
}
@Override
public String toString() {
return "MathAnnontation{" +
"id=" + id +
", math='" + math + '\'' +
'}';
}
}
再创建一个学科类,通过注解给其对象赋值:
package cn.edu.springdemo.annontationDemo;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class DisciplineAnnontation {
@Resource(type = MathAnnontation.class) //或者 @Resource(name = "mathAnnontation"),默认使用 name 属性
private MathAnnontation Discipline;
public MathAnnontation getDiscipline() {
return Discipline;
}
public void setDiscipline(MathAnnontation discipline) {
Discipline = discipline;
}
@Override
public String toString() {
return "DisciplineAnnontation{" +
"Discipline=" + Discipline +
'}';
}
}
测试结果:
package cn.edu.springdemo.test;
import cn.edu.springdemo.annontationDemo.DisciplineAnnontation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AdminTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("annontationDemo.xml");
DisciplineAnnontation discipline = (DisciplineAnnontation) applicationContext.getBean("disciplineAnnontation");
System.out.println(discipline);
}
}
结果如图:
@Autowired 注解
@Autowired,是一种注解,通过对成员变量、方法和构造函数进行标注来完成自动装配,无需再添加 Getter/Setter 与 Bean property 属性。
在上面实例的基础下,只对学科类进行修改,如图:
结果一样:
注:
- 当 Spring 容器没有找到对应的 bean 对象时会抛出异常,可以使用 @Autowired(required = false) 让其显示为 null ;
- 使用 @Resource 也可以无需添加 Getter/Setter ;
- @Autowired 是根据类型进行自动装配的。如果需要按名称进行装配,则需要配合 @Qualifier 使用(即 Spring 容器中有多个相同类型的 bean 时,使用 @Qualifier 注解指明使用哪个 bean );
- @inject 与 @Autowired 类似,但需导入相应 jar 包,不推荐使用
context:component-scan 标签
在开启 spring 注解中,必须进行配置 context:component-scan 标签。下面再讲解其标签的部分细节:
- base-package 属性:指定 Spring 扫描注解的类的所在包,用逗号分隔多个需要扫描的包
- resource-pattern 属性:指定 Spring 只扫描指定的包的所需类,默认扫描配置包下的所有 class 文件
- <context:exclude-filter type=“” expression=“” /> 子标签:表示要排除的目标类
- <context:include-filter type=“” expression=“” /> 子标签:表示要包含的目标类,需要与 use-default-filters=“false” 配合使用
<!-- 只扫描 annontationDemo 包下的所有类 -->
<context:component-scan base-package="cn.edu.springdemo" resource-pattern="annontationDemo/*.class" />
<!-- 排除扫描指定注解类,@Component 注解类失效 -->
<context:component-scan base-package="cn.edu.springdemo" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Component" />
</context:component-scan>
<!-- 扫描包含的指定注解类,只有 @Component 注解类生效 -->
<context:component-scan base-package="cn.edu.springdemo" use-default-filters="false" >
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
</context:component-scan>
注:
type="annotation" expression="":根据注解类型
type=“assignable” expression="":根据某个具体的类或接口以及该接口实现类