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的作用,那么这一篇继续 ...
随机推荐
- JavaScript基本概念C - 真与假
真与假 与 c 和 c++ 非常相似, 但与 Java 不同, JS中被认为true或false范围很广.所有对象 (空字符串除外) 和非零数字都被视为 true.空字符串.零.null 和undef ...
- Windows下自由创建.htaccess文件的N种方法
.htaccess是apache的访问控制文件,apache中httpd.conf的选项配合此文件,完美实现了目录.站点的访问控 制,当然最多的还是rewrite功能,即URL重写,PHP中实现伪静态 ...
- 部署和调优 2.4 tomcat安装
下载tamcet 官网 http://tomcat.apache.org/ 左侧选择版本 复制下载链接 切换到下载目录 cd /usr/local/src linux wget wget http:/ ...
- C#高级参数ref的使用
ref关键字用于将方法内的变量改变后带出方法外.具体我们通过例子来说明: 例子中,将变量n1和n2交换了.如果没有加ref参数,由于没有swadDemo()方法没有返回值,调用后,n1和n2是不会交换 ...
- Go并发原理
Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言:也正是Go语言的并发特性,吸引了全球无数的开发者. 并发(concurrency)和并行(parallellism) 并发(c ...
- Solr5.5.3的研究之路 ---1、从Mysql导入数据并创建索引
公司需要用到全文检索,故使用Solr,也是新人一枚,本人查看的前提是Solr已经安装部署成功,我用的服务器是自带的Jetty 1.创建Collection [root@whoami bin]# ./s ...
- NULL、0、nullptr
C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: int *i = NULL;foo_t *f = NULL; 实际上在C语言中,NULL通常被定义为如下: #defi ...
- Codeforces 1076E Vasya and a Tree(树状数组)或dfs
题意:给你一颗以1为根节点的树,初始所有节点的权值为0,然后有m个操作,每个操作将点x的所有距离不超过d的节点权值+1,问经过m次操作后每个节点权值是多少? 思路:如果是一个序列,就可以直接用树状数组 ...
- Mysql GROUP_CONCAT 使用注意事项
GROUP_CONCAT 函数返回一个字符串结果,该结果由分组中的值连接组合而成,常和 GROUP BY 连用. 如果需要自定义分隔符可以使用 SEPARATOR. 示例: SELECT GROUP_ ...
- iOS 打包生成ipa文件(使用终端命令打包)
1. 打开终端 2.在终端输入cd +空格 把工程文件直接拖到终端,然后回车 3. 在终端输入xcodebuild,回车 然后你可以发现工程文件里多了一个build文件夹 在build文件夹中,有一个 ...

