轻量级,无侵入

Bean管理
  1 创建applicationContext.xml
  2 配置被管理的Bean
  3 获取Bean

pom.xml配置

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.12.RELEASE</version>
</dependency>

1 创建applicationContext.xml 

<!-- 打开jar包,docs,spring-framework-reference,html,index,打开后有一行
点击 这一行 D. XML Schema-based configuration --> <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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"> </beans>

2 配置被管理的Bean


比如我们需要对某个dao进行操作,这个dao中有一些方法

public class UserDao{
  public UserDao() {}
  public void save() {}
  public void init() {}
  public void destroy() {}
}

<!-- 把类交给spring管理,用bean节点 ,class是受管理的完全限定名,
id,也可以用name(name就可以取多个名字)
<bean name="userDao,myDao" class="com.kaishengit.dao.UserDao"></bean> 如果用id表示,还想给他赋name属性
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<alias name="userDao" alias="myDao"/>
name处放id的值
-->
<bean id="userDao" class="com.kaishengit.dao.UserDao"></bean>

3 获取Bean

public class Test {
public static void main(String[] args) {
//读取applicationContext.xml配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
/*以前创建对象是new,现在交给spring后,就是用getBean,userDao是配置中id的名字*/
UserDao dao = (UserDao) context.getBean("userDao");
dao.save();
}
}

表现其 无侵入性
只需要在UserDao中有定义这两个方法init ,destroy,就能在初始化时候执行init,销毁时执行--
destroy,而且在UserDao中没有导入什么什么包的

<bean id="userDao" class="com.kaishengit.dao.UserDao" init-method="init" destroy-method="destroy"/>


------------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------

交给spring的类,默认都是单例模式

/* 在容器启动的时候
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
就会读取这个文件,并且创建所有交给spring处理的类 */
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao = (UserDao) context.getBean("userDao");
/*所以在getBean的时候就不会创建对象,即使是
UserDao dao = (UserDao) context.getBean("userDao");
UserDao dao2 = (UserDao) context.getBean("userDao");
也只是执行一次构造方法,可以看出,这是单例模式*/

那么如何改变这种单例模式? 比如在action的时候,每次请求都要到达一个action--
这个是不能单例的

Bean scopes

1 singleton(默认)
<bean id="userDao" class="com.kaishengit.dao.UserDao" scope="singleton"></bean>

2 prototype
<bean id="userDao" class="com.kaishengit.dao.UserDao" scope="prototype"></bean>

/* 这时候在执行
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
的时候就不会创建所有交给spring的类,而是在getbean的时候去创建
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao = (UserDao) context.getBean("userDao");
UserDao dao2 = (UserDao) context.getBean("userDao");
就真的会执行两次构造方法,创建两个对象*/

-----------------------------------------------------------------------------------

-----------------------------------------------------------------------------------

Bean的延迟加载

<bean id="userDao" class="com.kaishengit.dao.UserDao" lazy-init="true"></bean>    
/* 这时候在执行
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
的时候就不会创建所有交给spring的类,而是在第一次使用getbean的时候去创建
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao = (UserDao) context.getBean("userDao");
UserDao dao2 = (UserDao) context.getBean("userDao");
但是还是只执行一次构造方法*/

------------------------------------------------------------------------
------------------------------------------------------------------------
------------------------------------------------------------------------

IOC DI
  1. ICO 控制翻转
  2. DI 依赖注入
    注入的两种方式
      1 set注入
      2 构造方法注入

UserService依赖UserDao 以前是:

public class UserService {

    private UserDao userDao = new UserDao();
public void save() {
userDao.save();
}
}

那么就不用new,选择set注入

public class UserService {

    private UserDao userDao;

    public void save(){
System.out.println("1111");
}
//生成set方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}

需要配置

<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService">
<!-- name="userDao"是被注入类的属性名字 ,,是setUserDao的set后面的名字
ref="userDao"的这个userDao要和上面的id名字一致 -->
<property name="userDao" ref="userDao"/>
</bean> <!-- 或者是这种形式 --> <bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService">
<!-- userDao是被注入类的属性名字 ,,是setUserDao的set后面的名字-->
<property name="userDao">
<!-- ref="userDao"的这个userDao要和上面的id名字一致 -->
<ref bean="userDao"/>
</property>
</bean> <!-- 再或者是这种形式 -->
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService">
<property name="userDao">
<bean class="com.kaishengit.dao.UserDao"/>
</property>
</bean>

------------------------------------------------------------------------
------------------------------------------------------------------------

其他set注入

public class BookService {

    private int age;
private String name;
private List<String> address;
private Set<String> depts;
private Map<String, String> maps;
// 本身也是一个map结构
private Properties prop; public void show() {
System.out.println("age:" + age);
System.out.println("name:" + name);
System.out.println("--------List---------");
for(String str : address) {
System.out.println(str);
}
System.out.println("--------Set----------");
for (String str : depts) {
System.out.println(str);
}
System.out.println("--------Map----------");
for(Entry<String, String> entry : maps.entrySet()) {
System.out.println(entry.getKey() + " :" + entry.getValue());
} System.out.println("--------Properties--------");
for(Entry<Object, Object> entry : prop.entrySet()) {
System.out.println(entry.getKey() + " :" + entry.getValue());
} } public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAddress(List<String> address) {
this.address = address;
}
public void setDepts(Set<String> depts) {
this.depts = depts;
}
public void setMaps(Map<String, String> maps) {
this.maps = maps;
}
public void setProp(Properties prop) {
this.prop = prop;
}

注入

<bean id="book" class="com.kaishengit.service.BookService">
<property name="age" value="23"/>
<property name="name" value="Alex"/>
<property name="address">
<list>
<value>add1</value>
<value>add2</value>
<value>add3</value>
</list>
</property>
<property name="depts">
<set>
<value>s1</value>
<value>s2</value>
<value>s3</value>
</set>
</property> <property name="maps">
<map>
<entry key="k1" value="v1"/>
<entry key="k2" value="v2"/>
<entry key="k3" value="v3"/>
</map>
</property> <property name="prop">
<props>
<prop key="p1">v1</prop>
<prop key="p2">v2</prop>
<prop key="p3">v3</prop>
</props>
</property> </bean>

main函数中

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

BookService bookService = (BookService) context.getBean("book");
bookService.show();

------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------

构造方法注入 

public class UserService {

    private UserDao userDao;

    public UserService(UserDao userDao,String name) {
this.userDao = userDao;
System.out.println("name:" + name);
} public void save() {
userDao.save();
} }

需要配置

<bean id="userDao" class="com.kaishengit.dao.UserDao"/>

    <bean id="userService" class="com.kaishengit.service.UserService">
<!-- name是上面构造方法中参数的userDao,ref指注入的是配置中id的userDao这个类
不仅支持name,还支持index
<constructor-arg index="0" ref="userDao"/>这里的index指的是给第几个--
参数传值-->
<constructor-arg name="userDao" ref="userDao"/>
<constructor-arg name="name" value="Jack"/>
</bean>

========================================================================

========================================================================

========================================================================

接下来再说一个自动注入的

<!-- 自动注入 

    autowire="byName"之后就在整个配置文件中找setXxx方法的这个id叫做xxx的
比如setUserDao,就找id为userDao的,所以id就不能随便改-->
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService" autowire="byName"/> <!-- 去寻找类型匹配的数据com.kaishengit.dao.UserDao
但是有多个相同类型的就不行了---->
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService" autowire="byType"/> <!-- 构造方法注入,这种方法是先byName,找不到,就byType -->
<bean id="userDao" class="com.kaishengit.dao.UserDao"/>
<bean id="userService" class="com.kaishengit.service.UserService" autowire="constructor"/>

spring bean管理的更多相关文章

  1. spring 学习(二):spring bean 管理--配置文件和注解混合使用

    spring 学习(二)spring bean 管理--配置文件和注解混合使用 相似的,创建 maven 工程,配置pom.xml 文件,具体可以参考上一篇博文: sprint 学习(一) 然后我们在 ...

  2. spring bean管理 笔记1

    轻量级,无侵入 Bean管理 1 创建applicationContext.xml 2 配置被管理的Bean 3 获取Bean pom.xml配置 <dependency> <gro ...

  3. Spring企业级程序设计 • 【第2章 Spring Bean管理进阶】

    全部章节   >>>> 本章目录 2.1 bean标签和import标签 2.1.1 标签中的id属性和name属性 2.1.2 Bean的作用范围和生命周期 2.1.2 Be ...

  4. 使用 Java 配置进行 Spring bean 管理--转

    概述 众所周知,Spring 框架是控制反转 (IOC) 或依赖性注入 (DI) 模式的推动因素,而这种推动是通过基于容器的配置实现的.过去,Spring 允许开发人员使用基于 XML 的配置,通过利 ...

  5. Spring bean管理器 bean实例化的三种方式

    bean实例化的三种方式实现 第一种:使用类的无参数构造方法创建(常用 重要) 第一种实例化方式最常用,实例化类时会通过调用无参构造方法创建.示例代码如下: package spring.com.Us ...

  6. Spring Bean 管理

    1 Spring 工厂类 2 XML 方式 1.1 Bean 实例化的三种方式 无参构造方法 静态工厂方法 实例工厂方法 3 XML方式属性注入 4 注解方式 5 注解方式属性注入

  7. 面试阿里,字节,美团必看的Spring的Bean管理详解

    IOC容器 工厂只负责创建对象,而Spring当然不仅仅是一个对象工厂,其核心是一个对象容器,其具备控制反转的能力,所以也称为IOC容器. 帮助我们存放对象,并且管理对象,包括:创建.销毁.装配,这样 ...

  8. spring的bean管理

    1.所有的类都可以交给Spring管理 2.如何把一个类交给bean管理? (1)配置applicationContext.xml (2)在xml中写入bean节点配置要交给bean管理的类 3.程序 ...

  9. 如何在自定义Listener(监听器)中使用Spring容器管理的bean

    正好以前项目中碰到这个问题,现在网上偶然又看到这个问题的博文,那就转一下吧. 原文:http://blog.lifw.org/post/46428852 感谢作者 另外补充下:在web Server容 ...

随机推荐

  1. 怎样在WIN7系统下安装IIS和配置ASP

    一:Windows7系统 (IIS是WIN7自带的,版本7.0),首先是安装IIS.打开控制面板,找到“程序与功能”,点进去,点击左侧“打开或关闭Windows功能”,找到“Internet 信息服务 ...

  2. JNI_Z

    1. ZC: 用到 VC6 ... http://blog.csdn.net/jiangwei0910410003/article/details/17465085 http://blog.csdn. ...

  3. decimal与 float的区别

      decimal 数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边.decimal 数据类型存储了一个准确(精确)的数字表达法:不存储值的近似值. 定义 decimal 的列.变量和 ...

  4. Javascript-理解事件总结

    事件 [事件流]表述的是从页面接收事件的顺序.1.事件冒泡流:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档).所有浏览器都支持.2.事件捕获:与事件冒泡相反,事件捕获的用意在 ...

  5. python字典中dict.get()和dict.setdefault()的异同点

    相同点: 两者是参数相同:dict.get(key, default=None), dict.setdefault(key, default=None) 如果指定的键不存在时,两者都返回默认值,默认是 ...

  6. Codeforces Round #242 (Div. 2)C(找规律,异或运算)

    一看就是找规律的题.只要熟悉异或的性质,可以秒杀. 为了防止忘记异或的规则,可以把异或理解为半加运算:其运算法则相当于不带进位的二进制加法. 一些性质如下: 交换律: 结合律: 恒等律: 归零律: 典 ...

  7. AutoCAD2014的安装与激活

    1.安装包与激活文件的下载 链接:https://pan.baidu.com/s/1I2-x9T__sQAgtvjkOyc_1Q 密码:5pd1 2.CAD的安装 此过程没什么特殊要求,安装时随便输入 ...

  8. 详解linux互斥锁 pthread_mutex和条件变量pthread_cond

    [cpp] view plaincopy ============================================================= int pthread_creat ...

  9. Java VM(虚拟机) 参数

    -XX:PermSize/-XX:MaxPermSize,永久代内存: 1. 虚拟机参数:-ea,支持 assert 断言关键字 eclipse 默认是不开启此参数的,也就是虽然编译器支持 asser ...

  10. [转载] 最简单的基于FFmpeg的AVDevice例子(读取摄像头)

    =====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDev ...