1. 对象创建:单例/多例  【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

  2. 什么时候创建?
    • 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>
    • 使用注解(建议)
      • 使用注解步骤
      1. 开启注解扫描

        <context:component-scan base-package="cn.fuyi.c_setProperty"></context:component-scan>
      2. 使用注解    
 @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创建细节的更多相关文章

  1. Spring第二篇【Core模块之快速入门、bean创建细节、创建对象】

    前言 上篇Spring博文主要引出了为啥我们需要使用Spring框架,以及大致了解了Spring是分为六大模块的-.本博文主要讲解Spring的core模块! 搭建配置环境 引入jar包 本博文主要是 ...

  2. Spring中常见的bean创建异常

    Spring中常见的bean创建异常 1. 概述     本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.fa ...

  3. Spring AOP 源码分析 - 创建代理对象

    1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...

  4. spring中自动装配bean

    首先用@Component注解类: package soundsystem: import org.springframework.stereotype.Component; @Component p ...

  5. 阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式

    目前这里能调用是因为,在service的实现类里面,new了一个dao的对象 正常情况下 这里不应该是new一个对象,应该等于null或为空 设置为空侯再运行就会报错 出错的原因是这里为null 需要 ...

  6. Java进阶知识17 Spring Bean对象的创建细节和创建方式

    本文知识点(目录): 1.创建细节         1) 对象创建: 单例/多例         2) 什么时候创建?         3)是否延迟创建(懒加载)         4) 创建对象之后, ...

  7. Spring读书笔记——bean创建(下)

    有关Spring加载bean系列,今天这是最后一篇了,主要接上篇对于从Spring容器中获取Bean的一些细节实现的补充. <Spring读书笔记--bean加载>--Spring如何加载 ...

  8. 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 ...

  9. Spring 源码 (1)Spring IOC Bean 创建的整体流程

    Spring IOC 中涉及的重要接口 BeanDefinition Bean的描述信息,实现类包括 RootBeanDefinition 和 GenericBeanDefinition,Bean的描 ...

  10. Spring读书笔记——bean创建(上)

    通过<Spring读书笔记--bean加载>和<Spring读书笔记--bean解析>,我们明白了两件事. Spring如何加载消化一个xml配置文件 Spring如何将xml ...

随机推荐

  1. Web的Ajax应用开发模式(一)——了解Ajax的使用形式

    寄语: 前天在查看一些公司的招聘要求时,看到有公司要求测试人员了解Ajax,故写此博文旨在帮助测试人员提高自身技术知识水平,愿与广大测试同胞共同进步.(欢迎纠错!!!) 图1: 图2:

  2. Cheatsheet: 2014 11.01 ~ 11.30

    Mobile Android SDK: Working with Picasso View Debugging in Xcode 6 5 Common C# tasks in Apple Swift ...

  3. Cheatsheet: 2013 11.12 ~ 11.30

    Mobile Xcode 5 Essentials Android vs. iOS Development: Fight! Using MVC to Understand ASP.NET, iOS, ...

  4. 命令行运行R语言脚本(代码)

    1 Windows: 键入 cd C:\Program Files\R\R-3.2.0\bin   工作目录切换到R的核心程序目录 键入 R BATCH F:\Test.R 或 Rscript F:\ ...

  5. [YY]已知逆序列求原序列(二分,树状数组)

    在看组合数学,看到逆序列这个概念.于是YY了一道题:已知逆序列,求出原序列. 例子: 元素个数 n = 8 逆序列 a={5,3,4,0,2,1,1,0} 则有原序列 p={4,8,6,2,5,1,3 ...

  6. NSCalendar

    1.获取当前时间的年月日时分秒    /*    // 获取当前时间    NSDate *now = [NSDate date];    NSLog(@"now = %@", n ...

  7. HDU 5818 Joint Stacks(联合栈)

    HDU 5818 Joint Stacks(联合栈) Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  8. Spark.ML之PipeLine学习笔记

    地址: http://spark.apache.org/docs/2.0.0/ml-pipeline.html   Spark PipeLine 是基于DataFrames的高层的API,可以方便用户 ...

  9. T-SQL JOIN

    a表name sex张三 男李四 女 b表name age李四 30王五 23 1 全外连接select a.name,a.sex,b.name,b.agefrom a full outer join ...

  10. 几种HtmlEncode的区别(转)

    一.C#中的编码 HttpUtility.HtmlDecode.HttpUtility.HtmlEncode与Server.HtmlDecode.Server.HtmlEncode与HttpServe ...