spring来了-03-bean创建细节
- 对象创建:单例/多例 【bean节点的属性scope】
- scope="singleton", 默认值,即默认是单例 【service/dao/工具类】
- scope="prototype", 多例 【Action】
@Test
public void testScope() throws Exception {
ApplicationContext ac =
new ClassPathXmlApplicationContext("cn/fuyi/a_helloworld/ApplicationContext.xml");
User user1 = (User)ac.getBean("user");
User user2 = (User)ac.getBean("user");
System.out.println(user1);
System.out.println(user2);
System.out.println(user1 == user2);
} /**Output
当设置 scope="singleton"时
cn.fuyi.a_helloworld.User@70941f0a
cn.fuyi.a_helloworld.User@70941f0a
true
当设置 scope="prototype"时
cn.fuyi.a_helloworld.User@70941f0a
cn.fuyi.a_helloworld.User@c820344
false
*/test Code
- 什么时候创建?
- scope="singletom", 在启动IOC容器时,就已经创建了bean,且整个应用中只有一个
- scope="prototype", 在用到的时候,才创建对象
重写User的无参构造函数
public User() {
System.out.println("----user创建----");
} @Test
public void testScope1() throws Exception {
ApplicationContext ac =
new ClassPathXmlApplicationContext("cn/fuyi/a_helloworld/ApplicationContext.xml");
System.out.println("----容器创建----"); User user = (User)ac.getBean("user");
System.out.println(user);
}
/**Output
当scope="singleton"时
----user创建----
----容器创建----
cn.fuyi.a_helloworld.User@36446fd2
当scope="prototype"时
----容器创建----
----user创建----
cn.fuyi.a_helloworld.User@7d311feb
*/
test Code
3. 是否延迟创建,只在scope="singleton"时有效 【bean节点的属性lazy-init】
- lazy-init="default" / lazy-init="false" 默认值,在启动IOC容器时,就已经创建了bean,且整个应用中只有一个
- lazy-init="true" 在第一次使用单例对象时,创建对象,只创建一次
4.创建对象之后,初始化/销毁 【bean节点的属性init-mothod/destroy-mothod】
- init-mothod="init_user" 对应对象的init_user()方法,在对象创建完成之后执行
- destroy-mothod="destroy_user" 在调用容器对象的destroy()方法时执行,此时容器用实现类,即
- 亲测:对象创建为单例时两者可正常执行,为多例时每次创建对象后都会执行init-mothod,只后不会执行destroy-mothod.
在User对象中添加
public void init_method() {
System.out.println("user对象初始化");
} public void destory_method() {
System.out.println("user对象销毁");
} @Test
public void testLazyInit() throws Exception {
//创建容器
ClassPathXmlApplicationContext ac =
new ClassPathXmlApplicationContext("cn/fuyi/a_helloworld/ApplicationContext.xml");
System.out.println("----容器创建----"); //从容器中获取bean
User user = (User)ac.getBean("user");
System.out.println(user); //销毁容器
ac.destroy();
}
/**Output
在scope="singleton"时
----user创建----
user对象初始化
----容器创建----
cn.fuyi.a_helloworld.User@46cb560b
user对象销毁
在scope="prototype"时
----容器创建----
----user创建----
user对象初始化
cn.fuyi.a_helloworld.User@60209661 */test Code
5.创建对象
- 使用构造器
<!-- 创建对象 -->
<!-- 1.默认使用无参构造器 -->
<bean id="user1" class="cn.fuyi.b_createobject.User"></bean> <!-- 2.使用有参构造器 -->
<bean id="user1" class="cn.fuyi.b_createobject.User">
<constructor-arg value="22" index="1" type="java.lang.Integer"></constructor-arg>
<constructor-arg value="Jack" index="0" type="java.lang.String"></constructor-arg>
</bean> <bean id="str" class="java.lang.String">
<constructor-arg value="Jacks"></constructor-arg>
</bean>
<bean id="user" class="cn.fuyi.b_createobject.User">
<constructor-arg value="22" index="1" type="java.lang.Integer"></constructor-arg>
<constructor-arg ref="str" index="0" type="java.lang.String"></constructor-arg>
</bean>使用工厂类
<!-- 工厂类创建对象 -->
<!-- 工厂类:实例方法 -->
<!-- 先创建工厂类 -->
<bean id="factory" class="cn.fuyi.b_createobject.ObjectFactory"></bean>
<bean id="user1" factory-bean="factory" factory-method="getInstance"></bean> <!-- 工厂类:静态方法
class 指定工厂类型
factory-method 指定静态工厂方法
-->
<bean id="user" class="cn.fuyi.b_createobject.ObjectFactory" factory-method="getStaticInstance"></bean>
6.对象属性赋值,即注入依赖关系
- 使用构造器
- 使用set方法注入(建议)
<!-- 对象属性赋值 -->
<!-- 1.通过构造函数 -->
<bean id="user" class="cn.fuyi.c_setProperty.User">
<constructor-arg index="0" value="Jack" type="java.lang.String"></constructor-arg>
<constructor-arg index="1" value="100" type="java.lang.Integer"></constructor-arg>
</bean> <!-- 2.通过set方法给属性注入值 -->
<bean id="user" class="cn.fuyi.c_setProperty.User">
<property name="lastName" value="Fuyi"></property>
<property name="age" value="100"></property>
</bean>
- 使用内部bean
<bean id="userAction" class="cn.fuyi.c_setProperty.UserAction" scope="prototype">
<property name="userService">
<bean class="cn.fuyi.c_setProperty.UserService" scope="singleton">
<property name="userDao">
<bean class="cn.fuyi.c_setProperty.UserDao" scope="singleton"></bean>
</property>
</bean>
</property>
</bean> - 使用p 命名空间给对象属性注入值,【在spring3.0以上版本才可使用】
<bean id="userDao" class="cn.fuyi.c_setProperty.UserDao"></bean>
<bean id="userService" class="cn.fuyi.c_setProperty.UserService" p:userDao-ref="userDao"></bean>
<bean id="userAction" class="cn.fuyi.c_setProperty.UserAction" p:userService-ref="userService"></bean> <bean id="user" class="cn.fuyi.c_setProperty.User" p:lastName="fuyi" p:age="110"></bean>
- 自动装配
<!-- 也可以在beans节点的属性default-autowire中统一设置
byName 根据名称自动装配
byType 根据类型自动装配,必须确保IOC容器中只有一个该类型的对象
-->
<bean id="userDao" class="cn.fuyi.c_setProperty.UserDao"></bean>
<bean id="userService" class="cn.fuyi.c_setProperty.UserService" autowire="byName"></bean>
<bean id="userAction" class="cn.fuyi.c_setProperty.UserAction" autowire="byName"></bean> - 使用注解(建议)
- 使用注解步骤
- 开启注解扫描
<context:component-scan base-package="cn.fuyi.c_setProperty"></context:component-scan>
- 使用注解
- 自动装配
@Component("userService") //相当于 [<bean id="userService" class="" />],在类上加
@Resource(name="userDao") //相当于 [<property name="userDao" ref="userDao" />]
@Component 默认value="userService", 类名,首字母小写
@Resource 默认name="userDao" 类名,首字母小写
@Repository 持久层
@Service 业务层
@Controller 控制层
@Resource 根据类型查找
@Resource(name="userDao") 根据名称查找
spring来了-03-bean创建细节的更多相关文章
- Spring第二篇【Core模块之快速入门、bean创建细节、创建对象】
前言 上篇Spring博文主要引出了为啥我们需要使用Spring框架,以及大致了解了Spring是分为六大模块的-.本博文主要讲解Spring的core模块! 搭建配置环境 引入jar包 本博文主要是 ...
- Spring中常见的bean创建异常
Spring中常见的bean创建异常 1. 概述 本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.fa ...
- Spring AOP 源码分析 - 创建代理对象
1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...
- spring中自动装配bean
首先用@Component注解类: package soundsystem: import org.springframework.stereotype.Component; @Component p ...
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
目前这里能调用是因为,在service的实现类里面,new了一个dao的对象 正常情况下 这里不应该是new一个对象,应该等于null或为空 设置为空侯再运行就会报错 出错的原因是这里为null 需要 ...
- Java进阶知识17 Spring Bean对象的创建细节和创建方式
本文知识点(目录): 1.创建细节 1) 对象创建: 单例/多例 2) 什么时候创建? 3)是否延迟创建(懒加载) 4) 创建对象之后, ...
- Spring读书笔记——bean创建(下)
有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...
- IDEA02 利用Maven创建Web项目、为Web应用添加Spring框架支持、bean的创建于获取、利用注解配置Bean、自动装配Bean、MVC配置
1 环境版本说明 Jdk : 1.8 Maven : 3.5 IDEA : 专业版 2017.2 2 环境准备 2.1 Maven安装及其配置 2.2 Tomcat安装及其配置 3 详细步骤 3.1 ...
- Spring 源码 (1)Spring IOC Bean 创建的整体流程
Spring IOC 中涉及的重要接口 BeanDefinition Bean的描述信息,实现类包括 RootBeanDefinition 和 GenericBeanDefinition,Bean的描 ...
- Spring读书笔记——bean创建(上)
通过<Spring读书笔记--bean加载>和<Spring读书笔记--bean解析>,我们明白了两件事. Spring如何加载消化一个xml配置文件 Spring如何将xml ...
随机推荐
- hdu4992 Primitive Roots(所有原根)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4992 题意:给出n,输出n的所有原根. 思路:求出n的一个原根x,那么对于所以的i,i<phi( ...
- JAVA题目
1.在项目中创建Number类,判断字符串"mingrikejijiavabu"中字符"i"出现了几次,并将结果输出. 方法一: public class Nu ...
- head标签掉到body里的问题
HTML最开始的标签 <!DOCTYPE html>在其之前不能有任何的内容,否则head里的内容就会掉到body里,导致譬如网站的图标icon无法更新等的功能问题
- .Net需要掌握的知识
一.C#开发 1.C#基础 变量定义 如何变量的初始化 变量的作用域 常量 字符串处理 使用正则表达式 什么是CTS类型?数据类型如何分类以及各个数据类型范围 类型的转化分类 显式转换何隐式转化如何区 ...
- ARM寻址方式
寻址方式: 所谓寻址方式就是处理器根据指令中给出的信息来找到指令所需操作数的方式. 1.立即数寻址 2.寄存器寻址 3.寄存器间接寻址 就是寄存器中存放的是操作数在内存中的地址 例如以下指令: LDR ...
- Quick-Cocos2d-x v3.3 异步加载Spine方案 转
Quick-Cocos2d-x v3.3 异步加载Spine方案 浩月难求也与2015-03-25 15:06:3441 次阅读 背景 项目中使用了Quick-Cocos2d-x 3.3,由于Spin ...
- [转] Java内部类详解
作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...
- E2 2014.6.3 更新日志
增加功能 增加支持中关村获取商品信息 增加个人业绩查询功能 增加赠送和获赠查询功能 增加商品历程分析报表,资金历程分析报表,科目明细分析报表, 销售分析报表 增加服务维修明细表查询报表 完善功能 固定 ...
- Windows Live Writer配置
Windows Live Writer手工配置步骤: 1.在菜单中选择"Weblog";,然后选择"Another Weblog Service". 2.在We ...
- javascript知识总汇
命名: 变量名和函数命名:第一个单词小写以后每个单词首字母大写.geteElementById() 对象命名:每个单词首字母大写. 数据类型 typeof()方法返回数据类型. number数据类型: ...