第一种使用@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

 

 第三种使用@ComponentScan的方式:

@Configuration
@ComponentScan("com.springbean")
public class MainBeanConfig { }

指定需要扫描包的路径,相应的类中加上组件注解。

												

spring使用注解的方式创建bean ,将组件加入容器中的更多相关文章

  1. 三种方式创建bean对象在springIOC容器中初始化、销毁阶段要调用的自定义方法

    1. 使用@Bean注解定义initMethod和destroyMethod 所谓initMethod和destroyMethod,是指在springIOC容器中,对于bean对象执行到初始化阶段和销 ...

  2. SSH(Struts2+Spring+Hibernate)框架搭建流程<注解的方式创建Bean>

    此篇讲的是MyEclipse9工具提供的支持搭建自加包有代码也是相同:用户登录与注册的例子,表字段只有name,password. SSH,xml方式搭建文章链接地址:http://www.cnblo ...

  3. sping练习,在Eclipse搭建的Spring开发环境中,使用工厂方式创建Bean对象,将创建的Bean对象输出到控制台。

    相关 知识 >>> 相关 练习 >>> 实现要求: 在Eclipse搭建的Spring开发环境中,使用工厂方式创建Bean对象,将创建的Bean对象输出到控制台.要 ...

  4. 跟着刚哥学习Spring框架--通过XML方式配置Bean(三)

    Spring配置Bean有两种形式(XML和注解) 今天我们学习通过XML方式配置Bean 1. Bean的配置方式 通过全类名(反射)的方式   √ id:标识容器中的bean.id唯一. √ cl ...

  5. 基于注解的方式管理Bean

    --------------------siwuxie095                                 基于注解的方式管理 Bean         (一)准备         ...

  6. Spring工厂方式创建Bean实例

    创建Bean实例的方式: 1) 通过构造器(有参或无参) 方式: <bean id="" class=""/> 2) 通过静态工厂方法 方式: &l ...

  7. 7 -- Spring的基本用法 -- 7... 创建Bean的3种方式

    7.7 创建Bean的3种方式 ① 调用构造器创建Bean. ② 调用静态工厂方法创建Bean. ③ 调用实例工厂方法创建Bean. 7.7.1 使用构造器创建Bean实例. 使用构造器来创建Bean ...

  8. Spring Boot 使用Java代码创建Bean并注册到Spring中

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...

  9. Spring Boot 使用Java代码创建Bean并注冊到Spring中

    从 Spring3.0 開始,添加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition. 与Xml和Annotation两种配置方式 ...

随机推荐

  1. C语言学习系列(二)面向过程和面向对象

    一.基本定义 (一).面向过程(procedure oriented programming POP) 面向过程是分析解决问题的步骤,然后用函数把这些步骤一步一步的实现,然后在使用的时候一一调用则可. ...

  2. js 获取窗口大小

     //获得窗口大小         function findDimensions() //函数:获取尺寸         {             var point = {};          ...

  3. 001_linuxC++之_类的引入

    (一) C++类的引入,图片的程序比较好看,文中程序不贴出来 (二) 知识点 1. 成员函数的存取权限:公有的(public),保护的(protectd),私有的(private) 2. 第27行th ...

  4. 012_STM32程序移植之_内部flash开机次数管理lib库建立

    012_STM32程序移植之_内部flash开机次数管理lib库建立 1. 测试环境:STM32C8T6 2. 测试接口: 3. 串口使用串口一,波特率9600 单片机引脚------------CH ...

  5. [TJOI2019]唱、跳、rap和篮球

    嘟嘟嘟 TJ律师函警告 20分暴力比较好拿,因为每一种学生可以理解为无限多,那么总方案数就是\(C_{n} ^ {4}\),然后我们枚举至少讨论cxk的有几组,容斥即可. 需要注意的是,容斥的时候还要 ...

  6. 【AGC030F】Permutation and Minimum(DP)

    题目链接 题解 首先可以想到分组后,去掉两边都填了数的组. 然后就会剩下\((-1,-1)\)和\((-1,x)\)或\((x,-1)\)这两种情况 因为是最小值序列的情况数,我们可以考虑从大到小填数 ...

  7. C语言学习笔记4-数据输入和输出

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/50752127 作者:jadeshu   邮箱: jades ...

  8. 解决node-sass无法下载的问题

    本文链接:https://blog.csdn.net/qq383366204/article/details/86605960在国内用npm安装依赖的时候经常都会有各种奇怪的问题,个人强烈推荐用yar ...

  9. 使用axios请求的坑

    配置axios在vue-cli中的使用: 在main.js中配置 import axios from "axios" Vue.config.productionTip = fals ...

  10. pwn学习日记Day18 《程序员的自我修养》读书笔记

    知识杂项 obj文件:当前源代码编译成二进制目标文件 exe文件:将.obj文件与库文件.lib等文件链接生成的可执行文件 一个现代编译器的主要工作流程如下: 源程序(source code)→ 预处 ...