- 作者:老汪软件技巧
- 发表时间:2024-12-30 00:04
- 浏览量:
负责声明Bean的注解,常见的包括四个:
这几个本质上没区别,都是 @Component 的别名,就是在三层架构中起一个规范的作用
3. Spring 注解的使用
如何使用上述注解?
加入 aop 的依赖在配置文件中添加 context 命名空间在配置文件中指定扫描的包在 Bean 类上使用注解第一步:加入 aop 依赖
在加入 spring-context 依赖后,会关联加入 aop 的依赖。
第二步:在配置文件中添加 context 命名空间
"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 http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.powernode.spring6.bean"/>
beans>
4. 多个包扫描
<context:component-scan base-package="com.powernode.spring6.bean, com.powernode.spring6.dao"/>
<context:component-scan base-package="com.powernode.spring6" -->context:component-scan>
5. 选择性实例化 Bean
假设在某个包下有很多 Bean,有的是 Component,有的是 Controller。但因为某种特殊的业务,我们只允许 Controller 参与Bean管理,其他的都不实例化,该怎么做?
<context:component-scan base-package="com.powernode.spring6.bean2" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
context:component-scan>
<context:component-scan base-package="com.powernode.spring6.bean2" use-default-filters="true">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
context:component-scan>
5. 负责注入的注解
上面那四个注解是用来声明 Bean 的,声明之后 Bean 就会实例化,然后呢,就要给 Bean 的属性赋值啦,用到的注解有:
5.1 @Value
当属性的类型是简单类型时,可以使用 @Value 注解注入
@Component
public class User2 {
@Value("张二蛋")
private String name;
@Value("30")
private int age;
public User2(@Value("张四蛋") String name, @Value("38") int age) {
this.name = name;
this.age = age;
}
@Value("张三蛋")
public void setName(String name) {
this.name = name;
}
@Value("33")
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User2{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
5.2 @Autowired 与 @Qualifier
@Autowired 注解可以用来注入非简单类型
单独使用 @Autowired 注解,默认根据类型自动装配(byType)
该注解可以标注在哪里?
该注解有一个 required 属性,默认值是true,表示注入的时候要求被注入的 Bean 必须是存在的,如果不存在则报错。
根据类型
// @Autowired 使用时,不需要指定任何属性,直接使用
// 根据 byType 自动装配
@Autowired
private OrderDao orderDao;
根据名字
@Autowired
@Qualifier("orderDaoImplForOracle")
private OrderDao orderDao;
public void generate() {
orderDao.insert();
}
如果一个类当中构造方法只有一个,并且构造方法上的参数和属性都能够对应上,@Autowired 注解可以省略
5.3 @Resource
@Resource 注解也可以完成非简单类型注入,那他与 @Autowired 有什么区别呢?
@Resource 注解属于 JDK 扩展包,不在 JDK 中,需要额外引入下面的依赖(JDK 8 不用)
<dependency>
<groupId>jakarata.annotationgroupId>
<artifactId>jakarta.annotation-apiartifactId>
<version>2.1.1version>
dependency>
一定要注意:Spring6 已不再支持 JavaEE,它支持 JakartaEE9。(Oracle 把 JavaEE 给 Apache 了,Apache 给改名了,之前接触的所有 javax.* 一律改为 jakarta.* 了
Spring5 则引入下面的依赖
<dependency>
<groupId>javax.annotationgroupId>
<artifactId>javax.annotation-apiartifactId>
<version>1.3.2version>
dependency>
@Service("studentService")
public class StudentService {
@Resource(name="studentDaoImplForMySQL")
private StudentDao studentDao;
public void deleteStudent () {
studentDao.deleteById();
}
}
5.4 全注解开发
@Configuration
@ComponentScan({"cn.powernode.dao", "cn.powernode.service"})
public class Spring6Config {
}
@Test
public void testNoXML() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Spring6Config.class);
StudentService studentService = context.getBean("studentService", StudentService.class);
studentService.deleteStudent();
}