Spring IoC之Bean的装配

  1. 默认装配方式 通过getbean()方式从容器中获取指定的Bean实例,容器首先会调用Bean类的无参构造器,创建空值的实例对象。
    @Test
    public void test01() {
    // 加载Spring配置文件,创建Spring容器对象
    ApplicationContext ac = new ClassPathXmlApplicationContext("com/ba01/applicationContext.xml");
    // 从容器中获取指定的bean对象
    ISomeService service = (ISomeService) ac.getBean("someService");
    service.doFirst();
    service.doSecond();
    }
    public SomeServiceImpl() {
    System.out.println("===========");
    }
    若加入有参就会报错比如SomeServiceImpl(int a);
  1. 动态工厂Bean(创建工厂对象,调用方法)
    public class ServiceFactory {
    public ISomeService getSomeService() {
    return new SomeServiceImpl();
    }
    }

@Test
public void test01() {
// 加载Spring配置文件,创建Spring容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("com/ba02/applicationContext.xml");
// 从容器中获取指定的bean对象
// ServiceFactory sf = (ServiceFactory) ac.getBean("serviceFactory");
// ISomeService service = sf.getSomeService();
//降低类和类之间的耦合度,看不出实现类是谁,工厂是谁
ISomeService service = (ISomeService) ac.getBean("someService");
service.doFirst();
service.doSecond();
}
<bean id="serviceFactory" class="com.ba02.ServiceFactory"></bean>
<bean id="someService" factory-bean="serviceFactory" factory-method="getSomeService"></bean>
someService对象由serviceFactory工厂的getSomeService方法创建

  1. 静态工厂Bean(直接调用静态方法)
    public class ServiceFactory {
    public static ISomeService getSomeService() {
    return new SomeServiceImpl();
    }
    }

    <bean id="someService" class="com.ba03.ServiceFactory" factory-method="getSomeService"></bean>
    someService对象由com.ba03.ServiceFactory类的getSomeService方法创建

4.Bean的作用域
<bean id="someService" class="com.ba04.SomeServiceImpl" scope="prototype"/>
scope="prototype"的bean容器在接受到该类型的对象的请求的时候,会每次都重新生成一个新的对象给请求方;(即真正使用时才创建,每获取一次,都会创建不同的对象)
scope="singleton"的bean是由容器来保证这种类型的bean在同一个容器内只存在一个共享实例(容器初始化时就创建,每次获取的都是同一个对象。默认的)

?????5.Bean后处理器(这个还有一些问题)
public class MyBeanPostProcessor implements BeanPostProcessor {
// bean:当前调用Bean后处理器的Bean对象
//beanname:Bean对象的id
@Override
public Object postProcessAfterInitialization(Object bean, String beanname) throws BeansException {
System.out.println("执行****After****()");
return bean;
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanname) throws BeansException {
    System.out.println("执行****Before****()");
    return bean;
}

}

public void test01() {
// 加载Spring配置文件,创建Spring容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("com/ba05/applicationContext.xml");
// 从容器中获取指定的bean对象
ISomeService service1 = (ISomeService) ac.getBean("someService1");
service1.doFirst();
service1.doSecond();
System.out.println("----------------");
ISomeService service2 = (ISomeService) ac.getBean("someService2");
service2.doFirst();
service2.doSecond();
}
<bean id="someService1" class="com.ba05.SomeServiceImpl" />
<bean id="someService2" class="com.ba05.SomeServiceImpl" />
<bean class="com.ba05.MyBeanPostProcessor"></bean>
容器初始化之后对象初始化之前

6.定制Bean的生命始末
public void test01() {
// 加载Spring配置文件,创建Spring容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("com/ba06/applicationContext.xml");
// 从容器中获取指定的bean对象
ISomeService service = (ISomeService) ac.getBean("someService");
service.doFirst();
service.doSecond();
// 销毁方法的执行有两个要求:
// 1)被销毁的对象需要是singleton的,即单例
// 2)容器要显示关闭
((ClassPathXmlApplicationContext) ac).close();// 接口没有实现类有
}

public void initAfter() {
System.out.println("初始化之后");
}

public void preDestory() {
    System.out.println("销毁之前");
}

<bean id="someService" class="com.ba06.SomeServiceImpl"
    init-method="initAfter" destroy-method="preDestory" />

7.Bean的生命周期的可控点很多
step1.对象的创建
step2.执行setAdao()
step3.beanName=someService
step4.获取到beanFactory容器
step5.执行****Before()
step6.当前Bean初始化工作已经完毕
step7.初始化之后
step8.执行****After
()
step9.执行主业务方法
step10. 准备销毁工作,进行销毁流程
step11.销毁之前

8.id与name属性的区别
id的命名需要满足XML对ID属性命名规范;必须以字幕开头,可以包含字母,数字,下划线,连字符,句号,冒号。
name属性值则可以包含各种字符

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,642评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,781评论 6 342
  • 一、Spring框架 1.1 Spring框架是什么 Spring是一种容器框架,用于配置各个组件(bean)并且...
    Jane_Static阅读 387评论 0 0
  • Spring容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相...
    Theriseof阅读 2,804评论 1 24
  • 都市人有个通病,就是怕寂寞、无聊。 一到周末,我们便会呼朋引伴,各种饭局聚会下午茶走起,当然不忘发几条丰富多彩的朋...
    樱花蜗牛阅读 491评论 0 2