Bean注入

传统的Spring做法是使用.xml文件来对bean进行注入,这样做既麻烦又难维护。所以Spring后来引入了注解,大大减少配置文件,增加了web代码的可读性。

bean管理是指(1)spring创建对象 (2)spring注入属性。
当我们在将一个类上标注@Service或者@Controller或@Component或@Repository注解之后,spring的组件扫描就会自动发现它,并且会将其初始化为spring应用上下文中的bean。

(一)xml配置注入bean

1.创建bean

复制代码
public class Student {

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

    public Student() {
    }

    private String name;
    private int age;
    
    setter and getter ...
复制代码

2.添加xml配置

    <bean id="student" class="com.fantj.bean.Student">
        <property name="age" value="18"/>
        <property name="name" value="FantJ"/>
    </bean>

id表示bean的唯一标识,从bean工厂里获取实例化对象就是靠它,一般是类首字母小写。 property 用来初始化类的字段值,比如我初始化name=FantJ,age=18

3.执行查看结果

    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        Student person = (Student) applicationContext.getBean("student");
        System.out.println(person);
    }

这个getBean方法返回的是Object对象,但是我们很确定根据student这个id取出的就是Student的实例化对象,所以我们可以直接在这里做强制类型转换。

Student{name='FantJ', age=18}

(二)注解注入bean

官方定义:IoC又叫依赖注入(DI)。它描述了对象的定义和依赖的一个过程。依赖的对象通过构造参数、工厂方法参数或者属性注入,当对象实例化后依赖的对象才被创建,当创建bean后容器注入这些依赖对象。这个过程基本上是反向的。

(1)在Spring中,一个类我们为它加上注解就可以被识别为一个Bean

例如你在一个类上加上一个@Component注解,它在配置类的@ComponentScan注解扫描的包下,或者把这给个类在配置类中加上@Bean注解,那么它就被识别为Bean,加入到Spring容器里。

@Component
public class FirstBean {
}

或者直接把这个类在Spring配置类里实例化然后使用@Bean注解。

复制代码
@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {

    @Bean
    public FirstBean firstBean() {
        return new FirstBean();
    }
}
复制代码

(2)在一个Bean中调用另外一个Bean,就需要依赖注入

复制代码
@Component
public class SecondBean {
    private FirstBean firstBean;

    @Autowired
    public SecondBean(FirstBean firstBean) {
        this.firstBean = firstBean;
    }
    
    @Override
    public String toString() {
        return "SecondBean{firstBean=" + firstBean + '}';
    }
}
复制代码

一个Bean要调用另一个Bean,直接调用是允许的,需要通过自动装配注解@Autowired进行依赖注入才能达成目的。

常用注解

注解解释
@Configuration 标记的类是配置类
@ComponentScan(“包”) 指定哪个包,就扫描哪个包下的注解并识别。
@Autowired Bean的自动装配,可以标注在类的属性、方法及构造函数上。
@Component 把普通类标记为Bean,加入到容器里,并且是单例模式。
@Bean 定义一个Bean对象,加入到Spring容器里
@Order(数字) 容器加载Bean的优先级,数字越小优先级越高

1.注入Bean的不同方式

首先通过Configuration和@ComponentScan创建一个Spring的配置类。

@Configuration
@ComponentScan("com.imooc.spring.demo.bean")//项目的包名
public class SpringBeanConfiguration {
}

新建一个类FirstBean,通过@Component注解标记为Bean,加入到Spring容器里。

@Component
public class FirstBean {

}

(1)通过构造方法注入

复制代码
@Component
public class SecondBean {
    private FirstBean firstBean;

    @Autowired
    public SecondBean(FirstBean firstBean) {
        this.firstBean = firstBean;
    }
    
    @Override
    public String toString() {
        return "SecondBean{firstBean=" + firstBean + '}';
    }
}
复制代码

(2)通过Set方法注入

复制代码
@Component
public class ThirdBean {
    private FirstBean firstBean;

    @Autowired
    public void setFirstBean(FirstBean firstBean) {
        this.firstBean = firstBean;
    }

    @Override
    public String toString() {
        return "ThirdBean{firstBean=" + firstBean + '}';
    }
}
复制代码

(3)通过属性注入

复制代码
@Component
public class FourthBean {
    @Autowired
    private FirstBean firstBean;

    @Override
    public String toString() {
        return "FourthBean{firstBean=" + firstBean + '}';
    }
}
复制代码

属性注入时,private私有属性,Spring是通过反射去加载它到Spring容器里的。

(4)通过集合注入Bean

新建一个类FifthBean,标记为Bean。 加入一个List类型 的属性,用@Autowired注入。

在配置类中对加入一个返回值为List的方法或者加两个返回String的方法,使用Bean注解,这样就完成集合的赋值。

复制代码
@Component
public class FifthBean {
    @Autowired
    private List<String> stringList;

    public List<String> getStringList() {
        return stringList;
    }
}
复制代码
复制代码
@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {

    @Bean
    public List<String> stringList() {
        List<String> list = new ArrayList<>();
        list.add("hello");
        list.add("imooc");
        return list;
    }
}
复制代码
复制代码
@Configuration
@ComponentScan("com.imooc.spring.demo")
public class SpringBeanConfiguration {

    @Bean
    public String firstString() {
        return "bye";
    }
    @Bean
    public String secondString() {
        return "imooc";
    }
}
复制代码

第二种方式的优先级高于第一种,两种同时存在时Spring默认使用第二种,若要控制优先级要使用@Order注解来控制优先级顺序

2.例子

(1)创建配置类

@Configuration
public class MyConfig {

    @Bean
    public Student student(){
        return new Student("FantJ",20);
    }
}
  1. 先看@Bean注解,这个注解就是把Student这个类加载到IOC容器,我们看不到它的idpropertyid默认是方法名,当然也可以手动设置(不建议),以这样的方式设置:@Bean("xxx")。那如何初始化它的字段值呢,我们返回一个带有值的实例化对象就行。
  2. @Configuration注解是干嘛的呢,它用来声明这是一个配置类,Spring容器启动要来加载我这个类,如果不加这个配置,spring启动不会加载到它。既然Spring能来加载这个类,就会发现Bean注解,自然也把bean就加载了。当然这样的注解有很多,比如@Compoment、@Controller、@Service等都能完成,只不过它们有它们的特定使用的规范。最好不要乱用,造成代码可读性差。

(2)测试

ApplicationContext applicationContext1 = new AnnotationConfigApplicationContext(MyConfig.class);
Student bean = applicationContext1.getBean(Student.class);
System.out.println(bean);
Student{name='FantJ', age=20}

(3)@Component加载bean

千万不要以为注解加载Bean只有@Configuration能做到。

@Component
public class ComponentTest {
    @Bean
    public Student student(){
        return new Student("FantJ",21);
    }
}
ApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(ComponentTest.class);
Student bean1 = applicationContext2.getBean(Student.class);
System.out.println(bean1);
Student{name='FantJ', age=21}

 

posted @   ImreW  阅读(149)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示