一、加载Spring容器的三种方式 (读取bean.xml获取对象)
1.类路径:相对路径(src下默认放置) ======
-
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); (Object) context.getBean("object");
2.文件路径:绝对路径
-
ApplicationContext context = new FileSystemXmlApplicationContext("D:\\IDEAWorkspace\\项目名\\src\\beans.xml"); (Object) context.getBean("object");
3.使用BeanFactory
-
String path = "D:\\IDEAWorkspace\\项目名\\src\\beans.xml"; BeanFactory factory = new XmlBeanFactory(new FileSystemResource(path)); (Object) factory.getBean("object");
BeanFactory和ApplicationContext对比
- BeanFactory 采取延迟加载,首次getBean时才会初始化Bean
- ApplicationContext是对BeanFactory扩展,全部加载
二、 实例化Bean的三种方式 bean名找 实现类
方式1:new直接实现类 直接 ======
-
<bean id="bean名" class="包名.对应实现类"></bean>
方式2:通过静态工厂方法 引用实现类 的静态方法 工厂方法返回的是bean名的实现类
-
<bean id="bean名" class="包名.bean的直接工厂实现类" factory-method="静态方法"></bean>
方式3:通过实例工厂方法 引用实现类 的非静态方法 工厂方法返回的是bean名的实现类
-
<bean id="factory2" class="包名.Factory2实现类"></bean> <bean id="bean名" factory-bean="factory2" factory-method="非静态方法"></bean>
三、bean的作用域
<bean id="bean名" class="包名。实现类 " scope="singleton"></bean>
<bean id="bean名" class="包名。实现类 " scope="prototype"></bean>
singleton | 单例:在Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在,默认值 |
prototype | 多例:每次从容器中调用Bean时,都返回一个新的实例,new XxxBean() |
request | 每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境 |
session | 同一个HTTP Session 共享一个Bean,不同Session使用不同Bean,仅适用于WebApplicationContext 环境 |
globalSession | 一般用于Portlet应用环境,该作用域仅适用于WebApplicationContext 环境 |
四、bean生命周期 :忘了说了啥
- 1.instantiate bean对象实例化
- 2.populate properties 封装属性
- 3.如果Bean实现BeanNameAware 执行 setBeanName
- 4.如果Bean实现BeanFactoryAware 执行setBeanFactory ,获取Spring容器
- 5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
- 6.如果Bean实现InitializingBean 执行 afterPropertiesSet
- 7.调用<bean init-method="init"> 指定初始化方法 init
- 8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization 执行业务处理
- 9.如果Bean实现 DisposableBean 执行 destroy
- 10.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy
五、Bean属性(xml) 注入方式 属性注入
前提:提供一个student的Javabean
1.构造方法注入
<bean id="stu" class="包名.Student">
相当调用 public Student(String username, String password) 构造方法
<constructor-arg name="username" value="zjc"></constructor-arg>
<constructor-arg name="password" value="123"></constructor-arg>
</bean>-->
2.通过索引+类型 给构造方法赋值
<bean id="stu" class="包名.Student">
<constructor-arg index="0" value="zjc" type="java.lang.String"></constructor-arg>
<constructor-arg index="1" value="30" type="int"></constructor-arg>
<constructor-arg index="1" value="30" type="java.lang.Integer"></constructor-arg>
</bean>
3. 通过set方法往bean注入属性值
<bean id="stu" class="包名.Student">
<property name="username" value="zjc"></property>
<property name="password" value="123"></property>
<property name="age" value="12"></property>
</bean>
4.通过p命名空间注入
xmlns:p ="http://www.springframework.org/schema/p"
<bean id="stu" class="包名.Student"
p:username="zjc" p:password="123" p:age="32"></bean>
5.集合中注入 属性是集合类型时
<bean id="stu" class="包名.student实现类">
List
<property name="cars"> <list> <value>ofo</value> <value>mobai</value> <value>宝马</value> </list> </property>
Set
<property name="pats"> <set> <value>小黑</value> <value>小黄</value> <value>小白</value> </set> </property>
Map
<property name="infos"> <map> <entry key="name" value="zjc"></entry> <entry key="age" value="108"></entry> <entry key="ip" value="127.0.0.1"></entry> </map> </property>
Properties
<property name="mysqlInfos"> <props> <prop key="url">mysql:jdbc://localhost:3306/dbname</prop> <prop key="user">root</prop> <prop key="password">123456</prop> </props> </property>
数组
<property name="members"> <array> <value>哥哥</value> <value>弟弟</value> <value>妹妹</value> <value>姐姐</value> </array> </property>
</bean>
六、SpEL表达式 属性注入
-
<property name=" " value="#{表达式}"> 层面
示例:
- #{123}、#{'jack'} : 数字、字符串
- #{T(类).字段|方法} : 静态方法或字段
- #{beanId} : 另一个bean引用
- #{beanId.propName} : 操作数据
- #{beanId.toString()} : 执行方法
<bean id="customer" class="包名.Customer">
调用字符串方法
<property name="name" value="#{'zjc'.toUpperCase()}"></property>
Math.PI 调用静态方法
<property name="pi" value="#{T(java.lang.Math).PI}"></property>
</bean>
一个对象引用另外一个对象两写法
<!--创建一个地址对象--> <bean id="address" class="包名.Address"> <property name="name" value="北京"></property> </bean>
- 1.ref: 引用<property name="address" ref="address"></property>
- 2.SpEL:<property name="address" value="#{address}"></property>