• 作者:老汪软件技巧
  • 发表时间: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 +
                '}';
    }
}

_springboot注解开发_springaop注解开发

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


上一条查看详情 +一句话,我让 AI 帮我做了个 P 图网站!
下一条 查看详情 +没有了