Spring框架基础(依赖注入-全注解形式)

1. @Configuration注解

@Configuration注解的意义就是告诉 Spring框架,当前这个类就是配置文件,代替以前的 xml 配置文件。通常需要联合@ComponentScan注解一起使用。

2.@ComponentScan注解

扫描指定包 ,把里面带注解(注解指的是包下所有加了 @Service、@Component、@Repository 的类)的类自动创建对象、放进 Spring 容器。

将创建的对象放入Spring容器中后,就可以使用相关方法从Spring容器中获取Bean对象了:

java 复制代码
// 1. 加载配置类,启动Spring容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(你的配置类.class);

// 2. 根据【类型】拿Bean(最常用、推荐)
UserService service = ctx.getBean(UserService.class);

// 3. 根据【Bean名字】拿Bean
Object bean = ctx.getBean("方法名");

3.@Bean注解

在配置类里,把方法返回对象交给 Spring 容器管理,替代 <bean> 标签。这里为什么要将方法返回的对象交给Spring容器管理,因为有些第三方类无法手动添加@Component等注解(比如:

DataSource、Druid连接池、事务管理器、第三方工具类),只能使用相关方法创建第三方类的对象。我们将这些复杂的创建对象方式打包整合成为一个方法,为这个方法标记@Bean注解。

学会了上面几种全注解形式,我们就可以将之前的代码逻辑转换为全注解形式的代码了。

首先创建一个Config包,在包中创建一个名为Config的java类,写入前两个注解表示当前类是Spring的配置类:

java 复制代码
package com.newFile.Config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.newFile")
public class Config {
    //这里可以放置@Bean配置
}

Spring的配置类

@Bean注解不仅仅可以在Spring的配置类中使用,在其他普通类中也可以使用。Spring的配置类功能可以参考之前Spring配置文件功能,

对比项 普通类 加了 @Configuration 的配置类
作用 写业务逻辑 定义 Spring 容器的配置规则
扫描方式 被 @ComponentScan 扫到才会注册 启动时直接被 AnnotationConfigApplicationContext 加载
@Bean 效果 普通类里的 @Bean 是「lite 模式」,不做 Bean 依赖的 CGLIB 代理 配置类里的 @Bean 是「full 模式」,会用 CGLIB 生成代理,保证单例和依赖正确性

而且很多Spring的高级功能如AOP等都需要在配置类上开启注解:@EnableTransactionManagement:开启注解事务(让 @Transactional 生效)
@EnableAspectJAutoProxy:开启 AOP 自动代理
@EnableWebMvc:开启 Spring MVC 配置
配置类中不能创建Spring容器!!!也就是说配置类中不能出现:ApplicationContext ctx = new AnnotationConfigApplicationContext("你的配置类路径");

需要注意的是,这里当我们使用@Component或其他注解标注一个类Bean容器同时使用了@Bean注解标注了创建这个类的方法时,再从Spring容器中通过getBean方法获取这个类的bean对象时会报错,因为不能同时有两个相同类Bean对象的创建方法。

但是@Bean注解是可以和@Value注解一起使用的。

Config类中:

java 复制代码
package com.newFile.Config;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import com.newFile.dao.User;
@Configuration
@ComponentScan("com.newFile")
public class Config {
    //这里可以放置@Bean配置
//    创建一个简单的方法来获取User对象
    @Bean(value = "getUser")
    public User getUser(){
        return new User();
    }
}

User类中:

java 复制代码
package com.newFile.dao;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//这里将Component注解注释掉防止多个类Bea对象的冲突
//@Component(value = "user1")
public class User {
    @Value("1")
    int id;
    @Value("mei")
    String name;
    @Value("19")
    int age;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
//记得创建一个无参构造方法
    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

最后编写测试类:

java 复制代码
import com.newFile.Config.Config;
import com.newFile.dao.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test{

    @org.junit.Test
    public void test() {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

        User user = (User)ctx.getBean("getUser");

        System.out.println(user);
    }
}

最后的运行结果:

相关推荐
小小龙学IT11 分钟前
Go 泛型(Generics)深度解析:从类型参数到生产实践
开发语言·数据库·golang
这个DBA有点耶15 分钟前
分区表深入:分区裁剪失效的6种场景、分区锁机制与维护实战
数据库·mysql·dba
蓝速科技28 分钟前
政务自助终端信创选型与无人值守落地方案
android·大数据·数据库·人工智能·科技·技术分享·政务
不会写DN31 分钟前
Go日志库工程选型与逃逸分析评测报告
java·服务器·golang
粤鼎恒业44 分钟前
惠州工厂电子料回收厂家推荐:从交接单反推筛选标准
大数据·数据库·算法·硬件架构·硬件工程·pcb工艺·材料工程
SL_staff1 小时前
合规性折旧:当知识资产因主权缺位在审计中‘功能性清零’
java·设计模式·开源
wzq11_6661 小时前
Kubernetes集群——基础篇(基础知识与搭建步骤一遍过!!!)
java·容器·kubernetes
ShineWinsu1 小时前
对于Redis:Redis的认识以及分布式系统的解析
linux·数据库·c++·redis·缓存·消息队列·分布式架构
Dreams_l1 小时前
基于SpringBoot实现的抽奖系统(一)
java·spring boot·后端
落魄实习生1 小时前
Agent Scope Java 2.x 系列【1】核心架构
java·开发语言·架构