首页 > 其他分享 >Bean注入

Bean注入

时间:2023-05-18 22:56:14浏览次数:42  
标签:firstBean public Bean Student 注解 class 注入

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

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

 

标签:firstBean,public,Bean,Student,注解,class,注入
From: https://www.cnblogs.com/imreW/p/17413540.html

相关文章

  • Spring Could not find unique TaskExecutor bean 错误
    这个错误其实是debug级别的错误,是不影响运行的。错误栈为:15:27:57.726DEBUG12844---[nio-8080-exec-1].s.a.AnnotationAsyncExecutionInterceptor:CouldnotfinduniqueTaskExecutorbeanorg.springframework.beans.factory.NoUniqueBeanDefinitionException:Noqu......
  • 泛微CheckServer.jsp注入
    /mobile/plugin/CheckServer.jsp通过urldecode可以绕过泛微waf......
  • 依赖注入 (DI) 是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组
    依赖注入(DI)是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩展性和可测试性。在日常工作中,我们一定遇见过这些问题或者疑惑。Singleton服务为什么不能依赖Scoped服务?多个构造函数的选择机制?源码是如何识别循环依赖的?虽然我们可......
  • Spring的原型Bean(Prototype)声明和注入方式
    目录一、了解单例和原型Bean1.1什么是单例Bean?什么是原型Bean?1.2如何去定义一个原型Bean二、注入原型Bean的方法2.1使用ApplicationContext的getBean每次进行获取2.2使用@Lookup注解三、使用场景四、参考一、了解单例和原型Bean1.1什么是单例Bean?什么是原型Bean?单例Bean,......
  • 28、说说Java Bean的命名规范
    JavaBean类必须是一个公共类,并将其访问属性设置为publicJavaBean类必须有一个空的构造函数:类中必须有一个不带参数的公用构造器,此构造器也应该通过调用各个特性的设置方法来设置特性的缺省值。一个javaBean类不应有公共实例变量,类变量都为private持有值应该通过一组存取方法(g......
  • 无感带载启动,高频注入和DQ位置估算完整代码,有原理
    无感带载启动,高频注入和DQ位置估算完整代码,有原理图。全开源代码,不是库。可用于压缩机,水泵,风扇,空调,洗衣机等场合。可编译。ID:213900636564495410......
  • 【Jmeter】BeanShell 脚本
    一、BeanShellBeanShell是由java编写的,是一个轻量级的脚本语言,也相当于一个小巧免费的JAVA源码解释器,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中,能动态执行JAVA源代码并为其扩展了脚本语言的一些特性BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己......
  • .NET 通过源码深究依赖注入原理
    依赖注入(DI)是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩展性和可测试性。在日常工作中,我们一定遇见过这些问题或者疑惑。Singleton服务为什么不能依赖Scoped服务?多个构造函数的选择机制?源码是如何识别循环依赖的?虽然我们可......
  • SpringBoot项目预加载数据——ApplicationRunner、CommandLineRunner、InitializingBe
    0、参考、业务需求参考:https://www.cnblogs.com/java-chen-hao/p/11835120.html#_label1https://zhuanlan.zhihu.com/p/541268993业务需求:缓存数据字典数据、初始化线程池、提前加载好加密证书1、方式实现ApplicationRunner接口实现CommandLineRunner接口实现In......
  • SpringBoot配置两个一样的Bean,区分两个配置类
    1、@Primary作用:指定默认bean。当没有根据名字显示要注入哪个bean的时候,默认使用打了@Primary标签的bean2、配置两个一样的bean@ConfigurationpublicclassMyThymeLeafConfig{@ResourceprivateApplicationContextapplicationContext;/**自定义的bea......