Spring(二)scope、集合注入、自动装配、生命周期
原文链接: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、集合注入、自动装配、生命周期的更多相关文章
- Spring -- 入门,装备集合,自动装配,分散装配,自定义编辑器
1. 概要 struts2:web hibernate:持久化 spring:业务层.管理bean的,容器.List Map Set. 体验spring: 1.创建java项目. 2.引入spring ...
- spring作用、spring注解、管理对象的作用域与生命周期、自动装配、Spring的框架包有哪些作用是什么
Spring 1. 作用 创建和管理对象,使得开发过程中,可以不必使用new关键字创建对象,而是直接获取对象!并且,还可以通过一些配置,使得某些获取到的对象,其中某些属性已经是被赋值的! 2. Spr ...
- spring实战二之Bean的自动装配(非注解方式)
Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...
- 8 -- 深入使用Spring -- 2...6 Spring 4.0 增强的自动装配和精确装配
8.2.6 Spring 4.0 增强的自动装配和精确装配 Spring提供了@Autowired 注解来指定自动装配,@Autowired可以修饰setter方法.普通方法.实例变量和构造器等.当使 ...
- spring bean的作用域和自动装配
1 Bean的作用域 l singleton单列:整个容器中只有一个对象实例,每次去访问都是访问同一个对象 默认是单列 l prototype原型: 每次获取bean都产生一个新的对象,比如Ac ...
- Spring入门(5)-自动装配Bean属性
Spring入门(5)-自动装配Bean属性 本文介绍如何装配Bean属性. 0. 目录 ByName ByType constructor 默认自动装配 混合使用自动装配和显示装配 1. ByNam ...
- Spring学习-- IOC 容器中 bean 的生命周期
Spring IOC 容器可以管理 bean 的生命周期 , Spring 允许在 bean 声明周期的特定点执行定制的任务. Spring IOC 容器对 bean 的生命周期进行管理的过程: 通过 ...
- Asp.Net Core 3.1学习-依赖注入、服务生命周期(6)
1.前言 面向对象设计(OOD)里有一个重要的思想就是依赖倒置原则(DIP),并由该原则牵引出依赖注入(DI).控制反转(IOC)及其容器等概念.在学习Core依赖注入.服务生命周期之前,下面让我们先 ...
- Spring Bean 注入 1 - 构造方法注入,属性注入,自动装配
1.代码结构图 xxx 2.bean代码 package com.xxx.bean; /** * Created with IntelliJ IDEA. * User: zhenwei.liu * D ...
随机推荐
- Lua笔记
闭包 示例一 function newCounter() return function() -- anonymous function i = i + return i end end c1 = n ...
- 由overflow-x:scroll产生的收获
我们都知道float:left属性会让元素向左浮动,如果用一个div将几个左浮动的li包起来,是不是div的宽度被li撑得很长很长呢,代码: <!DOCTYPE html> <htm ...
- vertical-align和line-height的那些事
可能是又遇到了瓶颈,好长时间感觉css上没什么可看.从来没觉得css有什么难,什么盒模型和各种流也觉得理解起来毫不费力,但好像仅限于此.对一些属性仅限于常用,有时会去做实验验证一些属性,过后就忘了.现 ...
- php中echo(),print(),print_r(),var_dump()间的区别
echo()函数:输出一个或多个字符串.实际上它并不是一个函数,所以不必对它使用括号,直接用echo就行.然而,如果您希望向echo()传递一个以上的参数,使用括号将会生成解析错误.echo()函数比 ...
- winfrom自定义滚动条
panel或图片什么的跟着鼠标走,这里panel自己可以加背景图或直接搞个图就行了.为了演示清楚,有个滚动条控件做对比,与自定义的同步. using System; using System.Coll ...
- 国内外三个不同领域巨头分享的Redis实战经验及使用场景
Redis不是比较成熟的memcache或者Mysql的替代品,是对于大型互联网类应用在架构上很好的补充.现在有越来越多的应用也在纷纷基于Redis做架构的改造.首先简单公布一下Redis平台实际情况 ...
- HDU 3584 Cube (三维 树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584 Cube Problem Description Given an N*N*N cube A, ...
- 异步调用window.open时被浏览器阻止新窗口解决方案
var wyWindow = window.open('_blank');$http.post($rootScope.baseUrl + '/Interface0231A.ashx', { userF ...
- 设计模式(十二):bridge模式
刚开始看到这个模式并不是很理解,之后在网上看到别人的博客,才大致抓住了脉络. 何谓抽象和实现分离:就是将一个实际的物件跟它的所具有的功能分离.<大话设计模式>中有对手机品牌和具体的手机应用 ...
- CF2.C(二分贪心)
C. Road to Cinema time limit per test 1 second memory limit per test 256 megabytes input standard in ...