原文链接:http://www.orlion.ga/189/

一、scope

bean的scope属性中常用的有两种:singleton(单例,默认)和prototype(原型,每次创建新对象)

例:beans.xml

<bean id="userService" class="ml.orlion.service.UserService" scope="prototype">
    <property name="userDao" ref="userDao"/>
</bean>

在java文件中:

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService)appContext.getBean("userService");
UserService userServic2 = (UserService)appContext.getBean("userService");
System.out.println(userService == userServic2);// 输出false

二、集合注入

UserDAOImpl.java:

package ml.orlion.dao.impl;

import java.util.List;
import java.util.Map;
import java.util.Set;
import ml.orlion.dao.UserDAO;
import ml.orlion.model.User; public class UserDAOImpl implements UserDAO{
    
    private Set<String> sets;
    private List<String> lists;
    private Map<String , String> maps;
    
    public void saveUser(User user){
        System.out.println("save usering");
    }     public Set<String> getSets() {
        return sets;
    }     public void setSets(Set<String> sets) {
        this.sets = sets;
    }     public List<String> getLists() {
        return lists;
    }     public void setLists(List<String> lists) {
        this.lists = lists;
    }     public Map<String, String> getMaps() {
        return maps;
    }     public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }
    
    public String toString(){
        return sets.size() +"|"+ lists.size() +"|"+ maps.size();
    }
}

beans.xml中配置:

<bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
      
      <property name="sets">
          <set>
              <value>1</value>
          </set>
      </property>
      <property name="lists">
          <list>
              <value>1</value>
              <value>2</value>
          </list>
      </property>
      <property name="maps">
          <map>
              <entry key="1" value="1"></entry>
              <entry key="2" value="2"></entry>
              <entry key="3" value="3"></entry>
          </map>
      </property>
  </bean>

然后测试一下:

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserDAO userDao = (UserDAO) appContext.getBean("userDao");
System.out.println(userDao);// 输出 1|2|3

三、自动装配AutoWire

autowire属性有六种值:autodatact、byName、byType、constructor、default、no

byName:按照名字自动去匹配

byType:按照类型自动匹配

UserDAOImpl.java:

package ml.orlion.dao.impl;

import ml.orlion.dao.UserDAO;
import ml.orlion.model.User; public class UserDAOImpl implements UserDAO{
    // 添加id以区分
    private int daoId;
    
    public int getDaoId() {
        return daoId;
    }     public void setDaoId(int daoId) {
        this.daoId = daoId;
    }     public void saveUser(User user){
        System.out.println("save usering");
    }
    
    public String toString(){
        return "daoId" + daoId;
    }
}

beans.xml:

<bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
      
     <property name="daoId" value="1"></property>
  </bean>
  <bean id="userDao2" class="ml.orlion.dao.impl.UserDAOImpl">
     <property name="daoId" value="2"></property>
  </bean>   <bean id="userService" class="ml.orlion.service.UserService" scope="prototype" autowire="byName">
  </bean>

测试一下:

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
System.out.println(userService.getUserDao());

这时候会输出daoId=1

注:如果所有的bean都用同一种,可以使用beans的属性:defalut-autowire

四、生命周期

1、lazy-init

lazy-init="true"则bean在Ioc容器初始化的时候不进行初始化

注:可以beans标签上设置default-lazy-init="true"

2、init-method(bean初始化的时候执行)、destroy-method(bean销毁的时候执行)

UserService.java

package ml.orlion.service;

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User; public class UserService {     private UserDAO userDAO = new UserDAOImpl();     public void init(){
        System.out.println("init");
    }
    
    public void destroy(){
        System.out.println("destroy");
    }
    public UserDAO getUserDao() {
        
        return userDAO;
    }     public void setUserDao(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
    
    public void saveUser(User user){
        this.userDAO.saveUser(user);
    }
}

beans.xml:

<bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
     <property name="daoId" value="1"/>
  </bean>   <bean id="userService" class="ml.orlion.service.UserService" destroy-method="destroy" init-method="init">
      <property name="userDao" ref="userDao"/>
  </bean>

测试:

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
appContext.destroy();// 需要主动调用该方法才会销毁bean

注:scope="prototype"时,调用destroy不会销毁bean。Ioc容器不会管理bean的生命周期

Spring(二)scope、集合注入、自动装配、生命周期的更多相关文章

  1. Spring -- 入门,装备集合,自动装配,分散装配,自定义编辑器

    1. 概要 struts2:web hibernate:持久化 spring:业务层.管理bean的,容器.List Map Set. 体验spring: 1.创建java项目. 2.引入spring ...

  2. spring作用、spring注解、管理对象的作用域与生命周期、自动装配、Spring的框架包有哪些作用是什么

    Spring 1. 作用 创建和管理对象,使得开发过程中,可以不必使用new关键字创建对象,而是直接获取对象!并且,还可以通过一些配置,使得某些获取到的对象,其中某些属性已经是被赋值的! 2. Spr ...

  3. spring实战二之Bean的自动装配(非注解方式)

    Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...

  4. 8 -- 深入使用Spring -- 2...6 Spring 4.0 增强的自动装配和精确装配

    8.2.6 Spring 4.0 增强的自动装配和精确装配 Spring提供了@Autowired 注解来指定自动装配,@Autowired可以修饰setter方法.普通方法.实例变量和构造器等.当使 ...

  5. spring bean的作用域和自动装配

    1 Bean的作用域 l  singleton单列:整个容器中只有一个对象实例,每次去访问都是访问同一个对象  默认是单列 l  prototype原型: 每次获取bean都产生一个新的对象,比如Ac ...

  6. Spring入门(5)-自动装配Bean属性

    Spring入门(5)-自动装配Bean属性 本文介绍如何装配Bean属性. 0. 目录 ByName ByType constructor 默认自动装配 混合使用自动装配和显示装配 1. ByNam ...

  7. Spring学习-- IOC 容器中 bean 的生命周期

    Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...

  8. Asp.Net Core 3.1学习-依赖注入、服务生命周期(6)

    1.前言 面向对象设计(OOD)里有一个重要的思想就是依赖倒置原则(DIP),并由该原则牵引出依赖注入(DI).控制反转(IOC)及其容器等概念.在学习Core依赖注入.服务生命周期之前,下面让我们先 ...

  9. Spring Bean 注入 1 - 构造方法注入,属性注入,自动装配

    1.代码结构图 xxx 2.bean代码 package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * D ...

随机推荐

  1. React虚拟DOM浅析

    在Web开发中,需要将数据的变化实时反映到UI上,这时就需要对DOM进行操作,但是复杂或频繁的DOM操作通常是性能瓶颈产生的原因,为此,React引入了虚拟DOM(Virtual DOM)的机制. 什 ...

  2. 微信小程序火车票查询 直取12306数据

    最终效果图: 样式丑哭了,我毕竟不是前端,宗旨就是练练手,体验微信小程序的开发,以最直接的方式获取12306数据查询火车票. 目录结构: search1是出发站列表,search2是目的站列表,命名没 ...

  3. uoj98未来程序改 纯暴力不要想了

    暴力模拟A了,数据还是良(shui)心(shui)的 90分的地方卡了半天最后发现一个局部变量被我手抖写到全局去了,,, 心碎*∞ 没什么好解释的,其实只要写完表达式求值(带函数和变量的),然后处理一 ...

  4. Unity中的Matrix4x4类

    物体平移旋转一般变换底层都是用矩阵来表示的,一般不会用到这个类.有时候需要一些世界坐标与局部坐标转换的时候,可能就要用到了. //创建平移 旋转 缩放矩阵 可以理解为一个坐标系(不知道对不对..) M ...

  5. ceil 模块

    # 有时需要得到一个最小的整数,而这个数只能比自己大或相等,不能小于自己 #如: 2.1 我们需要得到的最小整数为3,即使后一位只有很小的一部分,一般用于分页 from math import cei ...

  6. window.onload和$(document).ready(function(){})的区别

    前段时间在面试之前查找并整理了一下window.onload和$(document).ready(function(){})区别,今天有时间更到我的博客上,由于本人资历尚浅,如有不对的地方,还请指正. ...

  7. iOS中一些算法函数

    rand() --- 随机数 求随机数 a-b     arc4random()%(b-a+1)+a abs() labs() ---- 整数绝对值 fabs()  fabsf()  fabsl() ...

  8. 一个简单的路由,用javascript实现

    前端路由在很多开源的js类库框架中都得到支持,如angularJS,Backbone,Reactjs等等.前端路由和后端路由原理一样,是让所有的交互和展现在一个页面运行以达到减少服务器请求,提高客户体 ...

  9. *HDU 1392 计算几何

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  10. C#程序代码分析(第三周)

    刚开始看到这段程序,都不知道是什么东西,问过室友才知道是C#程序:但对C#一点都不了解,最基本的项目建设都不会,在室友的帮助下,以及在网上搜了一些资料,勉强算是完成了此次作业吧. using Syst ...