一、加载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生命周期  :忘了说了啥

java在job中注入bean失败 java注入bean依赖_xml

  • 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>