spring中IOC容器注册和获取bean的实例
spring中常用的功能主要的是ioc和aop,此处主要说明下,实例注册和使用的方法,此为学习后的笔记记录总结
1.使用xml文件配置
在idea中创建maven工程,然后创建实例Person,然后在配置文件中配置bean,具体代码如下所示:,
public class Person {
private String name;
private Integer age;
public Person(){
super();
}
public Person(String name,Integer age){
super();
this.name=name;
this.age=age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="user" class="com.enjoy.cap1.Person">
<property name="name" value="zhangsan"/>
<property name="age" value="23"/>
</bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* 类说明
*
* @Date: 2019/5/1 14:54
* @Version: 1.0
*/
public class MainTest1 {
public static void main(String []args){
ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
Person person= (Person) ac.getBean("user");
System.out.println(person);
}
}
以上是使用xml文件配置实现的bean的注册和使用,运行结果如下所示:

----------------------------------------------------------------------------
2.下面使用注解的方式进行bean的注册与使用
首先需要一个配置文件,本例使用MainConfig.java,实例同上Persion,测试文件MainTest.java文件
代码如下所示:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* 类说明
*
* @Date: 2019/5/1 14:56
* @Version: 1.0
*/
@Configuration
public class MainConfig { @Bean
public Person person(){
return new Person("lisi",20);
}
}
public class MainTest2 {
public static void main(String []args){
ApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
Person person= (Person) app.getBean("person");
System.out.println(person);
}
}
运行结果如下所示:

针对以上情况的特殊说明:
1)在获取bean的实例时,xml配置文件中给出class指定类的全路径名,id指定Bena的名称,是通过反射创建对象(Person)的实例,
创建时需要有构造器,否则会在运行时提示bean构造报错;或者使用默认的构造器,或者自己创建带参的构造器,在注入的时候设置构造器参数,
对象的创建是有spring容器来创建和管理,而不是对象本身,通过依赖注入完成对象的依赖关系。
2)使用注解方式实现bean的注册时,可以通过构造器的名字进行改写,或者通过bean标签指定bean的名字,而不是固定的实体类的构造器名字,
一般默认情况是构造器的名字。注解可以使用扫描配置或者import等标签配置使用其他标签
若是不想直接改方法的名字,可以在@Bean标签后面直接指定bean的名字,如下截图所示:
测试时使用注解中的测试类即可。此处不再进行测试说明。
3)以上是bean的注册使用说明,但若是类特别多,则配置起来就会特别繁琐,增加工作量,此时就可以通过扫描标签帮助注册bean实例,
代码说明如下所示;
@Configuration
@ComponentScan(value = "com.enjoy.cap2")
public class MainConfig {
}

测试类的代码如下所示:
public class Test02 {
@Test
public void test(){
AnnotationConfigApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
String [] names=app.getBeanDefinitionNames();
for (String name:names){
System.out.println(name);
}
}
}
实体类不变,程序的运行结果如下所示;

4)在spring的容器中注册bean时默认是单例的,因为在整个容器中,通过id获取的时候,id值是唯一的,在容器启动时就创建并放到容器中(容器是一个map对象)

可以在配置文件中通过标签进行配置,在bean配置处,增加@Scope(“prototype”) ,可以实现多例,配置文件修改的代码如下所示:

测试类不变,在运行后会得出false的执行结果。
5)虽然spring容器中bean的注册默认是单例的,但可以通过标签@Lazy来指定获取对象时在进行bean实例的创建,而不是在容器启动时创建bean实例
不配置懒加载标签时,程序代码及运行结果如下所示;
package com.enjoy.cap4.config; import com.enjoy.cap1.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* 类说明
*
* @Date: 2019/5/1 16:16
* @Version: 1.0
*/
@Configuration
public class MainConfig { @Bean
public Person person(){
System.out.println("在容器中添加Person类的bean实例");
return new Person("zhangsan",11);
}
}
public class Test04 {
public static void main(String []args){
AnnotationConfigApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
System.out.println("IOC容器创建完成........");
app.getBean("person");
}
}
程序的运行结果为;

若在配置文件中的bean实例上添加Lazy标签,代码如下所示:

spring中IOC容器注册和获取bean的实例的更多相关文章
- Spring 中 IoC 容器简介
IoC 是一种通过描述来生成或者获取对象的技术,可以说 Spring 是一种基于 IoC 容器编程的框架 在一个系统中可以生成各种对象,并且这些对象都需要进行管理.为了描述这些对象关系,我们需要一个容 ...
- Spring中Ioc容器的注入方式
1 通过setter方法注入 bean类: package com.test; public class UserServiceImplement implements IUserService { ...
- spring源码学习之路---IOC容器初始化要义之bean定义载入(五)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,时间不多,研究 ...
- Spring 深入——IoC 容器 01
IoC容器的实现学习--01 目录 IoC容器的实现学习--01 简介 IoC 容器系列的设计与实现:BeanFactory 和 ApplicationContext BeanFactory load ...
- spring在IoC容器中装配Bean详解
1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...
- 使用Spring容器动态注册和获取Bean
有时候需要在运行时动态注册Bean到Spring容器,并根据名称获取注册的Bean.比如我们自己的SAAS架构的系统需要调用ThingsBoard API和Thingsboard交互,就可以通过Thi ...
- Spring重点—— IOC 容器中 Bean 的生命周期
一.理解 Bean 的生命周期,对学习 Spring 的整个运行流程有极大的帮助. 二.在 IOC 容器中,Bean 的生命周期由 Spring IOC 容器进行管理. 三.在没有添加后置处理器的情况 ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理
Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理 前言 上一篇分析了BeanFactoryPostProcessor的作用,那么这一篇继续 ...
随机推荐
- Solaris10 如何设置空闲ssh连接超时断开
在ssh的配置文件中有2个参数可以控制空闲连接超时断开.这2个参数是ClientAliveCountMax和ClientAliveInterval. Solaris10上设置空闲ssh连接超时断开的方 ...
- java 多线程系列基础篇(十)之线程优先级和守护线程
1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon ...
- hadoop再次集群搭建(5)-CDH Install
登录 http://node1.com:7180/.用户名和密码都是admin.启动服务命令是 service cloudera-scm-server start 最开始两个页面直接conti ...
- SQL Server连接Oracle FAIL
第一步 安装好oracle客户端Oracle 11.2.0.3 Client Win 64-bit,并配置好TNS信息 第二步,配置odbc信息 配置好odbc连接信息,sql server肯定不能直 ...
- PHP如何将XML转成数组
如果你使用 curl 获取的 xml data $xml = simplexml_load_string($data); $data['tk'] = json_decode(json_encode($ ...
- 用于.NET环境的时间测试(转)
用于.NET环境的时间测试 在.NET环境中,衡量运行完整算法所花费的时间长度,需要考虑很多 需要考虑很多种情况 ,如:程序运行所处的线程以及无用单位收集(GC垃圾回收). 在程序执行过程中无用单 ...
- Hibernate和JPA
ORM(Object/Relational Mapping : 对象关系映射)就是利用描述对象和数据库之间映射的元数据,自动(且透明)的将java应用程序中的对象持久化到关系数据库的表中.HIbern ...
- mongodb3.0版本的2种引擎对比
mongodb3.0以后 增加了wiredtiger引擎.常规引擎也升级到MMAPv1引擎(MongoDB2.6及以下版本用的是MMAP引擎): mmapv1引擎: col ...
- 机器人自主移动的秘密:实际应用中,SLAM究竟是如何实现的?(二)
博客转载自:https://www.leiphone.com/news/201612/FRzmoEI8Iud6CmT2.html 雷锋网(公众号:雷锋网)按:本文作者SLAMTEC(思岚科技公号sla ...
- 算法Sedgewick第四版-第1章基础-021一双向链表,在遍历时可修改、删除元素
package algorithms.ADT; /*************************************************************************** ...

