Spring框架Bean实例化的方式
  提供了三种方式实例化Bean
    构造方法实例化(默认无参数,用的最多)
    静态工厂实例化
    实例工厂实例化
  无参数构造方法的实例化

<!-- 默认情况下使用的就是无参数的构造方法. -->
<bean id="bean1" class="cn.yzu.spring3.demo2.Bean1"></bean>

  静态工厂实例化

public class Bean2Factory {
  public static Bean2 getBean2(){
    System.out.println("静态工厂的获得Bean2的方法...");
    return new Bean2();
  }
}
<!-- 第二种使用静态工厂实例化 -->
<bean id="bean2" class="cn.yzu.spring3.demo2.Bean2Factory" factory-method="getBean2"></bean>

  实例工厂实例化

public class Bean3Factory {
  public Bean3 getBean3(){
    System.out.println("Bean3实例工厂的getBean3方法...");
    return new Bean3();
  }
}
<!-- 第三种使用实例工厂实例化 -->
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="cn.yzu.spring3.demo2.Bean3Factory"/>

Bean的其他配置
  id和name的区别
    id遵守XML约束的id的约束.id约束保证这个属性的值是唯一的,而且必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号,name没有这些要求
    如果bean标签上没有配置id,那么name可以作为id.现在的开发中一般都使用id
  类的作用范围
    scope属性
      singleton :单例的.(默认的值.)
      prototype :多例的.
      request :web开发中.创建了一个对象,将这个对象存入request范围,request.setAttribute();
      session :web开发中.创建了一个对象,将这个对象存入session范围,session.setAttribute();
      globalSession :一般用于Porlet应用环境.指的是分布式开发.不是porlet环境,globalSession等同于session;
    实际开发中主要使用singleton,prototype
  Bean的生命周期
    配置Bean的初始化和销毁的方法
      init-method=”setup”
      destroy-method=”teardown”
      执行销毁的时候,必须手动关闭工厂,而且只对scope=”singleton”有效.
    Bean的生命周期的11个步骤
      1.instantiate bean对象实例化
      2.populate properties 封装属性
      3.如果Bean实现BeanNameAware 执行 setBeanName
      4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
      5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
      6.如果Bean实现InitializingBean 执行 afterPropertiesSet
      7.调用<bean init-method="init"> 指定初始化方法 init
      8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
      9.执行业务处理
      10.如果Bean实现 DisposableBean 执行 destroy
      11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy
      演示(在CustomerService类的add方法之前进行权限校验

public interface CustomerService {
  public void add();
  public void find();
}
public class CustomerServiceImpl implements CustomerService, BeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean {
  private String name;
  public void setName(String name) {
    System.out.println("第二步:属性的注入.");
    this.name = name;
  }
  public CustomerServiceImpl() {
    super();
    System.out.println("第一步:实例化类.");
  }
  public void add(){
    System.out.println("添加客户...");
  }
  public void find(){
    System.out.println("查询客户...");
  }
  public void setBeanName(String name) {
    System.out.println("第三步:注入配置的类的名称"+name);
  }
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    System.out.println("第四步:注入applicationContext"+applicationContext);
  }
  public void afterPropertiesSet() throws Exception {
    System.out.println("第六步:属性设置后执行...");
  }
  public void setup(){
    System.out.println("第七步:调用手动设置的初始化方法...");
  }
  public void destroy() throws Exception {
    System.out.println("第十步:调用销毁的方法...");
  }
  public void teardown(){
    System.out.println("第十一步:调用手动销毁方法...");
  }
}
public class MyBeanPostProcessor implements BeanPostProcessor{
  /**
  * bean:实例对象
  * beanName:在配置文件中配置的类的标识.
  */
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("第五步:初始化之前执行...");
    return bean;
  }
  public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
    System.out.println("第八步:初始化后执行...");
    // 动态代理:
    if(beanName.equals("customerService")){
      Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces() , new InvocationHandler() {
        // 调用目标方法的时候,调用invoke方法.
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          if("add".equals(method.getName())){
            System.out.println("权限校验...");
            Object result = method.invoke(bean, args);
            //System.out.println(System.currentTimeMillis());
            return result;
          }
          return method.invoke(bean, args);
        }
      });
      return proxy;
    }
    return bean;
  }
}
public class SpringTest4 {
  @Test
  // Bean完整的生命周期
  public void demo1() {
    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
    customerService.add();
    customerService.find();
    applicationContext.close();
  }
}

  运行结果:

   

Bean中属性注入

  构造器注入

<bean id="car" class="cn.yzu.spring3.demo5.Car">
  <!-- <constructor-arg name="name" value="宝马"/>
     <constructor-arg name="price" value="1000000"/> -->
  <constructor-arg index="0" type="java.lang.String" value="奔驰"/>
  <constructor-arg index="1" type="java.lang.Double" value="2000000"/>
</bean>

  setter方法注入

<bean id="car2" class="cn.yzu.spring3.demo5.Car2">
  <!-- <property>标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象 -->
  <property name="name" value="保时捷"/>
  <property name="price" value="5000000"/>
</bean>
<bean id="person" class="cn.yzu.spring3.demo5.Person">
  <property name="name" value="任童"/>
  <property name="car2" ref="car2"/>
</bean>

  名称空间p注入属性
    Spring2.5版本引入了名称空间p
      p:<属性名>="xxx" 引入常量值
      p:<属性名>-ref="xxx" 引用其它Bean对象
    引入名称空间

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    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="car2" class="cn.yzu.spring3.demo5.Car2" p:name="宝马" p:price="400000"/>
<bean id="person" class="cn.yzu.spring3.demo5.Person" p:name="童童" p:car2-ref="car2"/>

  SpEL:属性的注入
    Spring3.0提供注入属性方式
      语法:#{表达式}  <bean id="" value="#{表达式}">

<bean id="car2" class="cn.yzu.spring3.demo5.Car2">
  <property name="name" value="#{'大众'}"></property>
  <property name="price" value="#{'120000'}"></property>
</bean>
<bean id="person" class="cn.yzu.spring3.demo5.Person">
  <!--<property name="name" value="#{personInfo.name}"/>-->
  <property name="name" value="#{personInfo.showName()}"/>
  <property name="car2" value="#{car2}"/>
</bean>
<bean id="personInfo" class="cn.yzu.spring3.demo5.PersonInfo">
  <property name="name" value="张三"/>
</bean>

  集合属性的注入

<bean id="collectionBean" class="cn.yzu.spring3.demo6.CollectionBean">
  <!-- 注入List集合 -->
  <property name="list">
    <list>
      <value>童童</value>
      <value>小凤</value>
    </list>
  </property>
  <!-- 注入set集合 -->
  <property name="set">
    <set>
      <value>杜宏</value>
      <value>如花</value>
    </set>
  </property>
  <!-- 注入map集合 -->
  <property name="map">
    <map>
      <entry key="刚刚" value="111"/>
      <entry key="娇娇" value="333"/>
    </map>
  </property>
  <property name="properties">
    <props>
      <prop key="username">root</prop>
      <prop key="password">123</prop>
    </props>
  </property>
</bean>

加载配置文件
  一种写法:ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml",”bean2.xml”);
  二种方法:<import resource="applicationContext2.xml"/>

IOC装配Bean(XML方式)的更多相关文章

  1. 04_IOC容器装配Bean(xml方式)

    IOC容器装配Bean(xml方式) 1.Spring 提供配置Bean三种实例化方式 1)使用类构造器实例化(默认无参数) <bean id="bean1" class=& ...

  2. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  3. Spring框架(2)---IOC装配Bean(xml配置方式)

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...

  4. spring IOC装配Bean(注解方式)

    1 Spring的注解装配Bean (1) Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean (2) Spring的框架中提供了与@Componen ...

  5. Spring 框架 详解 (四)------IOC装配Bean(注解方式)

    Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component  描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注 ...

  6. Spring 框架 详解 (三)-----IOC装配Bean

    IOC装配Bean: 1.1.1 Spring框架Bean实例化的方式: 提供了三种方式实例化Bean. * 构造方法实例化:(默认无参数) * 静态工厂实例化: * 实例工厂实例化: 无参数构造方法 ...

  7. 05_IOC容器装配Bean(注解方式)

    IOC容器装配Bean(注解方式) 1.使用注解方式进行Bean注册 xml 方式: <bean id="" class=""> spring2.5 ...

  8. Spring框架---IOC装配Bean

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicat ...

  9. IOC装配Bean(注解方式)

    Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component 描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注解 ...

  10. Spring容器、BeanFactory和ApplicationContext,及3种装配Bean的方式

    目录 一. spring容器理解 二. BeanFactory和ApplicationContext之间的关系 三. BeanFactory详情介绍 四.ApplicationContext介绍 五. ...

随机推荐

  1. microsoft docx document operation with Java POI library

    microsoft docx document operation with Java POI library combine multiple docx document into one docu ...

  2. git 代码更新

    第一:先说首次使用 意思就是这个文件夹中的代码你还没有向GITHUB提交过代码 cd /home/test(假如 test就是你的用户名)/githubtest(这是个文件夹,你可以提前先建立好,这个 ...

  3. 用Python建立最简单的web服务器

    利用Python自带的包可以建立简单的web服务器.在DOS里cd到准备做服务器根目录的路径下,输入命令: python -m Web服务器模块 [端口号,默认8000] 例如: python -m ...

  4. WPF实现图片倒影

    比较简单,主要用到ScaleTransfrom类和VisualBrush类 <Window x:Class="实现图片倒影的方式.MainWindow" xmlns=&quo ...

  5. BZOJ3331: [BeiJing2013]压力

    传送门 Tarjan的三大应用之一:求解点双联通分量. 求解点双联通分量.然后缩点,差分优化即可. //BZOJ 3331 //by Cydiater //2016.10.29 #include &l ...

  6. 【Linux】使用update-alternatives命令进行版本的切换

    引言 在Redhat中也有此功能,用于切换不同版本. 在Debian系统中,我们可能会同时安装有很多功能类似的程序和可选配置,可能会出现同一软件的多个版本并存的场景.比如像是一些编程语言工具,一些系统 ...

  7. 第二轮冲刺-Runner站立会议05

    今天:将baseadapter的原理弄清楚了 明天:解决适配问题 困难:程序会停止运行

  8. 学习笔记——k近邻法

    对新的输入实例,在训练数据集中找到与该实例最邻近的\(k\)个实例,这\(k\)个实例的多数属于某个类,就把该输入实例分给这个类. \(k\) 近邻法(\(k\)-nearest neighbor, ...

  9. 4Struts2标签库----青软S2SH(笔记)

    这里弄错了,这一堆属性是<datetimepicker>标签的,不是<doubleselect>标签的 输出错误信息这个不错,挺方便的. 这个树形标签,也用了好多网络,分析如下 ...

  10. 2015.5.2-2015.5.8 Tip jQuery ,前端组件库,inline-block元素间距等

    有忙于它事,故延迟了,但在坚持! 1.Tip jQuery   2.给span加display: inline-block; 怎样能对齐? 解决方法:vertical-align: bottom:   ...