内容简介:spring 的bean 默认使用无参的构造方法。测试先创建工厂对象,然后实例化对象
spring 的bean 默认使用无参的构造方法。
使用静态工厂
package com.ming; public class BeanFactory { public static IMing createMing(){ return new Ming("ming"); } }
package com.ming; public interface IMing { public void hello(); }
package com.ming; public class Ming implements IMing{ private String ming = null; public Ming(String ming){ this.ming = ming; } @Override public void hello(){ System.out.println(this.ming); } public void setMing(String ming) { this.ming = ming; } public String getMing() { return ming; } }
<?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"> <bean id="ming" class="com.ming.BeanFactory" factory-method="createMing"/> </beans>
测试
package com.ming; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import static org.junit.Assert.*; public class MingTest { ApplicationContext applicationContext = null; @Before public void setUp() throws Exception{ applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void hello() { IMing ming = (IMing)applicationContext.getBean("ming"); ming.hello(); } }
实例工厂实例化
先创建工厂对象,然后实例化对象
<?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"> <!-- 工厂实例 --> <bean id="bean3Factory" class="com.ming.Bean3Factory"/> <bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"/> </beans>
package com.ming; /** * 实例工厂 * @author ming */ public class Bean3Factory { public IMing createBean3(){ System.out.println("bean3的工厂被执行"); return new Bean3(); } }
package com.ming; public class Bean3 implements IMing { @Override public void hello() { System.out.println(3333); } }
<?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"> <!-- 工厂实例 --> <bean id="bean3Factory" class="com.ming.Bean3Factory"/> <bean id="bean3" factory-bean="bean3Factory" factory-method="createBean3"/> </beans>
Bean配置
id 和 name都为别名
id 在ioc容器需要唯一
name 可以有多个名称,有非字符
Bean作用域
默认Bean为单例模式
同时可以设置为多例模式
<?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"> <bean id="person" class="com.ming.Ming" scope="prototype"/> </beans>
上方为多例
生命周期
载入容器会调用方法,销毁的时候会调用方法
package com.ming; public class Ming implements IMing{ public Ming(){ System.out.println("实例化"); } public void setUp(){ System.out.println("实例初始化"); } public void tearDown(){ System.out.println("被销毁"); } }
package com.ming; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MingTest { ApplicationContext applicationContext = null; @Before public void setUp() throws Exception{ applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void hello() { IMing ming = (IMing) applicationContext.getBean("ming"); } }
生命周期完整过程
对象实例化
设置属性
实现BeanFactoryAware 执行setBeanName 等
@Override public void setBeanName(String s) { System.out.println(s); System.out.println("第三步设置bean的名称"); }
实现BeanNameAware接口
获取工厂
@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("第四步 获取上下文对象" + applicationContext); }
实现 ApplicationContextAware
@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("第四步 获取上下文对象" + applicationContext); }
实现 BeanFactoryAware 接口
后置处理 前置处理
package com.ming; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("初始化前执行------"); return o; } @Override public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("初始化之后------"); return o; } public void ming(){ System.out.println("------"); } }
<bean class="com.ming.MyBeanPostProcessor"/>
此时会在初始化前和初始化后执行
属性设置后执行
指定初始化 init
执行自身的业务方法
销毁方法
实现DisposableBan 执行destroy
调用在bean标签中定义的方法
注意
spring 会实例化所有的类的对象
spring 会实例化所有的类,不会每次使用一个实例化一个,,那是动态语言。。。
后置处理器
对类进行增强,aop 在不修改源代码的时候,对类进行增强
Spring 中的生命周期
面向接口编程。。
编写接口
package com.ming; public interface UserDao { public void findAll(); public void save(); public void update(); public void delete(); }
package com.ming; public class UserDaoImpl implements UserDao { @Override public void findAll() { System.out.println("findAll"); } @Override public void save() { System.out.println("save"); } @Override public void update() { System.out.println("update"); } @Override public void delete() { System.out.println("delete"); } }
<bean id="userDao" class="com.ming.UserDaoImpl"/>
@Test public void hello() { UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.findAll(); }
对save方法进行增强
前置 后置处理器
package com.ming; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MyBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("初始化前执行------"); return o; } @Override public Object postProcessAfterInitialization(final Object o, String s) throws BeansException { System.out.println("初始化之后------"); System.out.println(s); Object object = Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()); System.out.println(proxy.getClass().getName()); // 此处调用 return method.invoke(o, args); } }); return object; } }
package com.ming; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MingTest { ApplicationContext applicationContext = null; @Before public void setUp() throws Exception{ applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void hello() { UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.delete(); } }
package com.ming; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MingTest { ApplicationContext applicationContext = null; @Before public void setUp() throws Exception{ applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); } @Test public void hello() { UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.delete(); } }
这里使用动态代理,进行代理调用 其中Proxy.newProxyInstance( 为dao
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- spring bean 一
- Spring系列(一):Spring MVC bean 解析、注册、实例化流程源码剖析
- Spring 系列(一):Spring MVC bean 解析、注册、实例化流程源码剖析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据驱动:从方法到实践
桑文锋 / 电子工业出版社 / 2018-3 / 49
本书是从理论到实践的全面且细致的企业数据驱动指南,从作者的百度大数据工作说起,完整还原其从零到一构建百度用户行为大数据处理平台经历。详解大数据本质、理念与现状,围绕数据驱动四环节——采集、建模、分析、指标,深入浅出地讲述企业如何将数据驱动方案落地,并指出数据驱动的价值在于“数据驱动决策”、“数据驱动产品智能”。最后通过互联网金融、电子商务、企业服务、零售四大行业实践,从需求梳理、事件指标设计、数据......一起来看看 《数据驱动:从方法到实践》 这本书的介绍吧!