Spring如何使用注解的方式创建bean

这篇文章主要介绍了Spring如何使用注解的方式创建bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

第一种使用配置类的方式

1、创建一个bean

package com.springbean;

public class Person {

  private String name;
  private Integer age ;

  public Person(String name, Integer age) {
    this.name = name;
    this.age = age;
  }

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

  public void setAge(Integer age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public Integer getAge() {
    return age;
  }

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

2、创建配置类:

import com.springbean.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PersonConfig {

  @Bean  //@Bean("myperson") 这是设置bean的名字
  public Person person(){   System.out.println("已经创建实例");
return new Person("张三",20); } }

3、测试

import com.spring.config.PersonConfig;
import com.springbean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ApplicationTest {
  public static void main(String[] args) {

    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(PersonConfig.class);
    Person bean = applicationContext.getBean(Person.class);
    System.out.println(bean);

    //获取bean的类型,默认是方法名,需要修改就在配置类中@Bean里面加上名字

    String[] beanNamesForType = applicationContext.getBeanNamesForType(Person.class);
    for (String beanType : beanNamesForType){
      System.out.println(beanType);
    }
  }
}

和xml配置文件一样,默认的bean是单例的,如果需要改变为prototype,xml配置文件里是加上scope="prototype",这里PersonConfig配置类中需要加上注解@Scope("prototype")。

介绍一下bean的几种类型的作用域。

  • singleton:单实例(默认),ioc容器启动时就会创建对象放到ioc容器中,以后每次获取都是直接从ioc容器中获取,ioc容器可以简单理解为map
  • prototype:多实例(原型),ioc容器启动并不会去调用方法创建对象,而是每次我们获取对象的时候,才会调用方法去创建。
  • requst:同一次请求创建一个实例
  • session:同一个session创建一个实例

不加注解测试:

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(PersonConfig.class);
    Person bean = applicationContext.getBean(Person.class);
    Person bean2 = applicationContext.getBean(Person.class);
    System.out.println(bean==bean2);//打印结果为true

加上注解@Scope("prototype")测试:

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(PersonConfig.class);
    Person bean = applicationContext.getBean(Person.class);
    Person bean2 = applicationContext.getBean(Person.class);
    System.out.println(bean==bean2);
//打印结果为fale

我们也可以改变单例时ioc加载的时候就创建实例,只要在我们的PersonConfig配置类中加上@Lazy注解,使用懒加载。测试

public class ApplicationTest {
  public static void main(String[] args) {

    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(PersonConfig.class);
    /* Person bean = applicationContext.getBean(Person.class);
    Person bean2 = applicationContext.getBean(Person.class);
    System.out.println(bean==bean2);*/
    /*
    String[] beanNamesForType = applicationContext.getBeanNamesForType(Person.class);
    for (String beanType : beanNamesForType){
      System.out.println(beanType);
    }*/
  }
}

这是时打印栏将不会打印出“已经创建实例”,就实现的单例情况下的懒加载。

第二种使用@import注解的方式

新建一个student类

public class Student {
}

在配置类PersonConfig上使用@Import注解,这里面可以传入一个数组,用大括号{}

@Configuration
@Import({Student.class})
public class PersonConfig {

测试:

public class DemoTest {

  ApplicationContext applicationContext = new AnnotationConfigApplicationContext(PersonConfig.class);

  @Test
  public void test(){

    Student bean = applicationContext.getBean(Student.class);
    System.out.println(bean);
  }
}

打印结果:com.springbean.Student@2c34f934 ,注入成功

还可以在@Import中加入ImportSelector的实现类来实现bean的注入

创建Parent和Teacher类

public class Parent {
}

public class Teacher {
}

创建ImportSelector的实现类MyImportSelector,返回需要注入的bean,这里是全类名

public class myImportSelector implements ImportSelector{
  @Override
  public String[] selectImports(AnnotationMetadata annotationMetadata) {

    return new String[]{"com.springbean.Parent","com.springbean.Teacher"};
  }
}

修改PersonConfig,这里传入实现类MyImportSelector

@Configuration
@Import({Student.class, myImportSelector.class})
public class PersonConfig {

测试:

Parent parent = applicationContext.getBean(Parent.class);
    Teacher teacher = applicationContext.getBean(Teacher.class);
    System.out.println(parent);
    System.out.println(teacher);

打印结果:

com.springbean.Parent@3b2cf7ab
com.springbean.Teacher@2aa5fe93

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring创建Bean的6种方式详解

    前言 本文讲解了在Spring 应用中创建Bean的多种方式,包括自动创建,以及手动创建注入方式,实际开发中可以根据业务场景选择合适的方案. 方式1: 使用Spring XML方式配置,该方式用于在纯Spring 应用中,适用于简单的小应用,当应用变得复杂,将会导致XMl配置文件膨胀 ,不利于对象管理. <bean id="xxxx" class="xxxx.xxxx"/> 方式2: 使用@Component,@Service,@Controler,@R

  • JSP 开发之Spring Boot 动态创建Bean

    JSP 开发之Spring Boot 动态创建Bean 1.通过注解@Import导入方式创建 a.新建MyImportBeanDefinitionRegistrar注册中心 Java代码 import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.GenericBeanDefinition; import org

  • spring实现bean对象创建代码详解

    我以一个简单的示例解构spring是怎样管理java对象的. 首先,定义一个简单的pojo,代码如下: package com.jvk.ken.spring; public class Demo { private String name; public Demo() { name="I'm Demo."; } public void printName() { System.out.println(name); } public void setName(String name) {

  • Spring工厂方法创建(实例化)bean实例代码

    目标明确 简单叙述一下本文想要解决的问题:如何在Spring中不再使用Spring创建Bean实例,而是把Bean创建过程转移到开发者手中. 思路清晰 创建Bean实例的方式: 1) 通过构造器(有参或无参) 方式: <bean id="" class=""/> 2) 通过静态工厂方法 方式: <bean id="" class="工厂类" factory-method="静态工厂方法"/

  • Spring BPP中如何优雅的创建动态代理Bean详解

    v一.前言 本文章所讲并没有基于Aspectj,而是直接通过Cglib以及ProxyFactoryBean去创建代理Bean.通过下面的例子,可以看出Cglib方式创建的代理Bean和ProxyFactoryBean创建的代理Bean的区别. v二.基本测试代码 测试实体类,在BPP中创建BppTestDepBean类型的代理Bean. @Component public static class BppTestBean { @Autowired private BppTestDepBean d

  • Spring Boot如何动态创建Bean示例代码

    前言 本文主要给大家介绍了关于Spring Boot动态创建Bean的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. SpringBoot测试版本:1.3.4.RELEASE 参考代码如下: package com.spring.configuration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.su

  • 关于Spring中Bean的创建进行更多方面的控制

    我们知道Spring Boot 中一个@Controller修饰的Bean是在什么时间被创建的,那么这个Bean创建时间能不能由我们管控?答案是肯定的 关于Spring中Bean的创建,除了配置装配属性外,我们还可以进行更多方面的控制. 1,首先,我们可以控制Bean是单例还是可以生成多个对象的. 在Spring中,Bean默认是单例的,如果想每次请求都生成一个新的Bean对象,可以在定义Bean时,在<bean>标签中配置scope属性为prototype,那么,就会允许该Bean可以被多次

  • 详解Spring Boot 使用Java代码创建Bean并注册到Spring中

    从 Spring3.0 开始,增加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式不同点在于: 前两种Xml和Annotation的配置方式为预定义方式,即开发人员通过 XML 文件或者 Annotation 预定义配置 bean 的各种属性后,启动 spring 容器,Spring 容器会首先解析这些配置属性,生成对应都?Bean Definition,装入到 DefaultL

  • Spring如何使用注解的方式创建bean

    这篇文章主要介绍了Spring如何使用注解的方式创建bean,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种使用配置类的方式 1.创建一个bean package com.springbean; public class Person { private String name; private Integer age ; public Person(String name, Integer age) { this.name = name

  • Spring如何通过注解存储和读取对象详解

    目录 1. 创建Spring 项目 1.1 创建⼀个 Maven 项⽬ 1.2 添加 Spring 框架支持 1.3 添加启动类 2. 存储 Bean 对象 2.1 创建Bean 2.2 配置 spring-config.xml 3. 获取并使用 Bean 对象 3.1 创建Sprign 上下文 3.2  获取指定的 Bean 对象 3.3 使用Bean 4.总结 5.配置扫描路径 6.添加注解存储 6.1 @Controller(控制器存储) 6.2 @Service (服务器存储) 6.3

  • Spring AOP 基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

  • Spring AOP  基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

  • Spring整合Mybatis 扫描注解创建Bean报错的解决方案

    目录 Spring整合Mybatis 扫描注解创建Bean报错 springboot+mybatis使用注解方式,出现错误创建dao层bean Spring整合Mybatis 扫描注解创建Bean报错 情景: LZ在整合Spring 和Mybatis 的时候,整合之后部署到tomcat报错 报错信息: Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name

  • Spring框架通过工厂创建Bean的三种方式实现

    工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有DriverName(机长姓名),此时可以使用工厂模式帮我们创建对象,有一个专门帮我们创建对象的类帮我们创建对象,这个类就叫工厂. public class AirPlane { private String DriverName;// 机长姓名 private String AirPlaneName;/

  • Spring创建bean实例的几种方式分享

    目录 前言 环境 通过bean的class属性创建实例(带参构造器) 工厂方法(静态工厂方法) 工厂方法(实例工厂方法) 工厂bean 总结 前言 Spring常见的创建bean实例的方式有: 1.通过bean的class属性创建实例 无参构造器 带参构造器 2.工厂方法 静态工厂方法 实例工厂方法 3.工厂bean 关于每种方式的Spring配置,详见文末总结. 环境 Ubuntu 22.04 IntelliJ IDEA 2022.1.3 JDK 17.0.3 Spring 5.3.21 准备

随机推荐