一.三种实例化Bean的方式

1.使用类构造器实例化(默认无参数)

<bean id="bean1" class="com.demo1.Bean1"></bean>

2.使用静态工厂方法实例化(简单工厂模式)静态方法

<bean id="bean2" class="com.demo2.Bean2Factory" factory-method="getBean2"></bean>

<!--需要创建一个UserFactroy类-->
public class Bean2Factory{
public static Bean2 getBean2(){
return new Bean2();
}}

3.使用实例工厂方法实例化(工厂方法模式)非静态方法

<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
<bean id="bean3Factory" class="com.demo2.Bean3Factory"/>
public class Bean3Factory{
public Bean3 getBean3(){
return new Bean3();
}
}

在applicationContext.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- bean对象创建
1.无参构造
-->
<bean name="user" class="com.bean.User"> </bean> <bean name="address" class="com.bean.Address">
</bean>
<!-- bean对象创建
2.静态工厂方法(不常用)
-->
<bean name="user1" class="com.bean.UserFactory" factory-method="createUser">
</bean>
<!-- bean对象创建
3.工厂方法L:非静态(不常用)
-->
<bean name="user2" factory-method="createUser1" factory-bean="factorybean"> </bean>
<bean name="factorybean" class="com.bean.UserFactory">
</bean>
</beans>

如果要使用工厂方法配置bean,而后要配置一个UserFactory.java对象

package com.bean;

/**
* Created by jiatp
*/
public class UserFactory {
public static User createUser(){
System.out.println("静态方法创建");
return new User();
} public User createUser1(){
System.out.println("非静态方法");
return new User();
}
}

Bean的命名,id属性和name属性:

一般情况下,装配一个Bean时,通过指定一个id属性作为Bean的名称

id 属性在IoC容器中必须是唯一

id 的命名要满足XML对ID属性命名规范

必须以字母开始,可以使用字母、数字、连字符、下划线、冒号

如果Bean的名称中含有特殊字符,就需要使用name属性

例如:

 <bean name="#person" class="com.bean.Person"/>

因为name属性可以相同,所以后出现Bean会覆盖之前出现的同名的Bean

Bean的作用域:

scope属性 :

* singleton:单例的.(默认的值.)

* prototype:多例的.

* request:web开发中.创建了一个对象,将这个对象存入request范围,request.setAttribute();

* session:web开发中.创建了一个对象,将这个对象存入session范围,session.setAttribute();

* globalSession:一般用于Porlet应用环境.指的是分布式开发.不是porlet环境,globalSession等同于session;

实际开发中主要使用singleton,prototype

<bean id="customer" class="com.demo3.Customer" scope="prototype"></bean>

Spring容器中Bean的生命周期:

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

二.依赖注入Bean的属性

代码实现:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<!-- 对象注入 -->
<!--
1) set方式注入
基本数据类型 : (8种)
引用数据类型 : 包含类类型的属性
-->
<bean name="user" class="com.bean.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
<property name="address" ref="address"></property>
</bean>
<bean name="address" class="com.bean.Address">
<property name="city" value="北京"></property>
<property name="street" value="王府井"></property>
</bean>
<!--
2)构造方法注入
-->
<bean name="user1" class="com.bean.User">
<!-- constructor-arg
name属性:参数的名称
value属性:参数的值
ref属性:引用的bean对象
index属性:说明参数位置 index="0"
type属性: 参数的类型 type="java.lang.String"
-->
<constructor-arg name="name" value="abc" type="java.lang.String"></constructor-arg>
<constructor-arg name="age" value="20" type="java.lang.Integer"></constructor-arg>
<constructor-arg name="address" ref="address"></constructor-arg>
</bean>
<!--
3) p名称注入(了解)
-->
<bean name="user3" class="com.bean.User"
p:name="张三" p:age="10" p:address-ref="address">
</bean>
<!--
4) spel 注入 spring Expression language string 表达式语言
-->
<bean name="user4" class="com.bean.User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user3.age}"></property>
<property name="address" ref="address"></property>
</bean>
</beans>

1) set方式注入 :

        基本数据类型  :  (8种) 

        引用数据类型 :  包含类类型的属性

使用set方法注入,在Spring配置文件中,通过<property>设置注入的属性,<property>标签中name就是属性名称,value是普通属性的值,ref:引用其他的对象,(ref中可引入其它bean名称)

2)构造方法注入 :

<constructor-arg name="name" value="李四" type="java.lang.String"></constructor-arg>

name属性:参数的名称  

             value属性:参数的值  

             ref属性:引用的bean对象 

             index属性:说明参数位置  index="0"

             type属性: 参数的类型   type="java.lang.String"

3) p名称注入

使用p命名空间

为了简化XML文件配置,Spring从2.5开始引入一个新的p名称空间

p:<属性名>="xxx" 引入常量值

p:<属性名>-ref="xxx" 引用其它Bean对象

引入名称空间:xmlns:p="http://www.springframework.org/schema/p"

        <bean name="user2" class="com.bean.User" p:name="p注入" p:age="12" p:address-ref="addresss">

4) SpEL 注入 spring Expression language string 表达式语言

语法:#{表达式}

<bean id="" value="#{表达式}">

<SpEL表达式语言

语法:#{}

#{'神回复:哈哈'}使用字符串

#{topicId3} 使用另一个bean

#{topicId4.content.toUpperCase()} 使用指定名属性,并使用方法

#{T(java.lang.Math).PI} 使用静态字段或方法

依赖注入:

应用:三层结构(控制层-业务层-数据层)

控制层依赖业务层(在控制层类中注入业务层对象)

业务层依赖数据层(在业务层类中注入数据层对象)

注入:

1.注入<constructor-arg>  成员变量赋值通过构造

2.注入<property>  成员变量赋值通过set方法

三.集合类型属性的注入

1.新建CollectionBean.java

package com.collection;

import java.util.*;

/**
* Created by jiatp
*/
public class CollectionBean {
private Object[] arr;//数组注入
private List list;//list注入
private Map map;//map注入
private Properties prop;//properties注入
private Set<String> sets;//set注入 public Object[] getArr() {
return arr;
} public void setArr(Object[] arr) {
this.arr = arr;
} public List getList() {
return list;
} public void setList(List list) {
this.list = list;
} public Map getMap() {
return map;
} public void setMap(Map map) {
this.map = map;
} public Properties getProp() {
return prop;
} public void setProp(Properties prop) {
this.prop = prop;
} @Override
public String toString() {
return "CollectionBean{" + "arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop + ", set=" + sets + '}';
}
}

applicationContext.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
<bean name="user" class="com.icss.bean.User">
<property name="name" value="李四"/>
</bean>
<!--1.数组注入-->
<bean name="cb" class="com.collection.CollectionBean">
<property name="arr">
<array>
<value>tom</value>
<value>jack</value>
<ref bean="user"/>
</array>
</property>
<!--2.list注入-->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property>
<!--3.map注入-->
<property name="map">
<map>
<entry key="url" value="jdbc:mysql://crm"/>
<entry key="user" value-ref="user"/>
</map>
</property>
<!--4.set注入-->
<property name="sets">
<set>
<value>zhansan</value>
<value>lisi</value>
</set>
</property>
<!--5.properties注入-->
<property name="prop">
<props>
<prop key="driverclass" >com.jdbc.mysql.Driver</prop>
<prop key="url" >jdbc:mysql:///crm</prop>
<prop key="username" >root</prop>
<prop key="password" >123456</prop>
</props>
</property>
</bean>
</beans>

使用多个xml配置文件

方式一 可以在创建ApplicationContext对象时传入多个配置文件

  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");

方式二 可以在配置文件中通过<import>引入其他配置文件

import resource="classpath:bean2.xml"/>

最新文章

  1. *HDU 1115 计算几何
  2. iOS之POST与GET的优缺点
  3. LeetCode之100. Same Tree
  4. windows批处理的介绍
  5. NYOJ995硬币找零(简单dp)
  6. CvMat 矩阵的使用方法和简单程序
  7. [原创]java WEB学习笔记67:Struts2 学习之路-- 类型转换概述, 类型转换错误修改,如何自定义类型转换器
  8. 关于SQL查询效率,100w数据,查询只要1秒
  9. TSS 内核栈 用户栈的关系
  10. bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡(SAM)
  11. Reactor模型
  12. 使用事件CreateEvent注意事项
  13. 实现 ready和bind事件
  14. Unity2D开发小细节
  15. 从此不再担心键盘遮住输入框OC(
  16. UVA11020 Efficient Solutions
  17. 《你不知道的javascript》读书笔记2
  18. ajax读取txt文本时乱码的解决方案
  19. Zabbix-Agent在主动模式启动服务后,提示no active checks on server [139.219.xx.xx:10051]: host [139.219.xx.xx] not found
  20. db2存储过程迁移

热门文章

  1. StringBuilder 和 StringBuffer类
  2. IOS配置cocos2d-x
  3. JS对象 String 字符串对象定义字符串的方法就是直接赋值。比如: var mystr = &quot;I love JavaScript!&quot;
  4. code+第四次网络赛div2
  5. 客户端app支付宝登录接口
  6. 校园商铺-4店铺注册功能模块-4Dto之ShopExecution的实现
  7. dp转图论——cf1070A好题
  8. VS2010-MFC(状态栏的使用详解)
  9. 杂项-语言-Swift:Swift
  10. JavaWeb三大组件—过滤器filter