网站上传的流程图,企业样本设计公司,wordpress q a,网站建设系统分析包括哪些目录
BeanFactory开发流程
ApplicationContext
BeanFactory与ApplicationContext对比
基于XML方式的Bean的配置
自动装配 BeanFactory开发流程 这里的第三方指的是Spring提供的BeanFactory#xff0c;Spring启动时会初始化BeanFactory#xff0c;然后读取配置清单#…目录
BeanFactory开发流程
ApplicationContext
BeanFactory与ApplicationContext对比
基于XML方式的Bean的配置
自动装配 BeanFactory开发流程 这里的第三方指的是Spring提供的BeanFactorySpring启动时会初始化BeanFactory然后读取配置清单xml文件获取需要被加载的bean。实现上面流程图的具体代码如下 创建beans.xml文件 public class Test {public static void main(String[] args) {//定义出一个bean工厂DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();//读取xml文件的读取器XmlBeanDefinitionReader reader new XmlBeanDefinitionReader(beanFactory);//读取配置文件reader.loadBeanDefinitions(beans.xml);UserService userService (UserService) beanFactory.getBean(userService);System.out.println(userService);}
}
因为我们在开发中要遵循三层架构业务层需要定义数据层那么接下来我们再在xml文件中指定要一个数据层bean。代码如下 public class UserServiceImpl implements UserService {//该方法由beanFactory来调用set注入public void setUserDao(UserDao userDao){System.out.println(由bean工厂调用该set方法);}
} 需要注意的是需要property标签中的属性的name应该是setXxx()方法中的Xxx第一个子母小写之后的字符ref标签指的是bean定义的id。接下来我们查看Test类的运行结果
public class Test {public static void main(String[] args) {//定义出一个bean工厂DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();//读取xml文件的读取器XmlBeanDefinitionReader reader new XmlBeanDefinitionReader(beanFactory);//读取配置文件reader.loadBeanDefinitions(beans.xml);UserService userService (UserService) beanFactory.getBean(userService);}
}
执行结果截图 BeanFactory是Spring中最重要的核心类下文中的ApplicationContext虽然叫做Spring容器但实际上在该类中最后调用的还是BeanFactory。
ApplicationContext
ApplicationContext称为Spring容器内部封装了BeanFactory比BeanFactory功能更丰富使用ApplicationContext时xml文件配置我们习惯叫做applicationContext.xml。接下来是一个示例代码
public class ApplicationContextTest {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(beans.xml);Object userService context.getBean(userService);}
}
BeanFactory与ApplicationContext对比
BeanFactory是Spring的早期接口称为Spring的Bean工厂ApplicationContext是后期更高级接口称之为Spring 容器ApplicationContext在BeanFactory基础上对功能进行了扩展例如: 监听功能、国际化功能等。BeanFactory的API更偏向底层ApplicationContext的API大多数是对这些底层API的封装;Bean创建的主要逻辑和功能都被封装在BeanFactory中ApplicationContext不仅继承了BeanFactory而且ApplicationContext内部还维护着BeanFactory的引用所以ApplicationContext与BeanFactory既有继承关系又有融合关系。Bean的初始化时机不同原始BeanFactory是在首次调用getBean时才进行Bean的创建而ApplicationContext则是配置文件加载容器一创建就将Bean都实例化并初始化好 基于XML方式的Bean的配置 XmI配置方式 功能描述 bean idclass Bean的id和全限定名配置 bean name 通过name设置Bean的别名通过别名也能直接获取到Bean实例 bean scope Bean的作用范围BeanFactory作为容器时取值singleton和prototype bean lazy-init Bean的实例化时机是否延迟加载。BeanFactory作为容器时无效 bean init-method Bean实例化后自动执行的初始化方法method指定方法名 bean destroy-method Bean实例销毁前的方法method指定方法名 bean autowirebyType 设置自动注入模式常用的有按照类型byType按照名字byName bean factory-bean factory-method/ 指定哪个工厂Bean的哪个方法完成Bean的创建
默认情况下单纯的Spring环境的Bean的作用范围有两个Singleton与Prototype
Singleton单例默认值Spring容器创建的时候就会进行Bean的实例化并存储到容器内部的单例池中每次getBean时都是从单例池中获取相同的Bean实例。Prototype原型Spring容器初始化时不会创建Bean实例当调用getBean时才会实例化Bean每次getBean都会创建一个新的Bean实例。
Spring实例化Bean的两种方式如下 一通过构造方法实例化 默认在xml文件中配置的信息都是调用了无参构造器但是如果我们需要参数时需要添加constructor-arg标签该标签标识向方法中传递参数。
beansbean iduserService classcom.zmt.service.impl.UserServiceImpl!-- 默认采用无参构造器但如果需要参数则需要进行配置 --constructor-arg name参数名称 value参数值/constructor-argproperty nameuserDao refuserDao/property/beanbean iduserDao classcom.zmt.dao.impl.UserDaoImpl/bean
/beans 二通过调用自定义的工厂方法对Bean进行实例化 静态工厂方法实例化Bean
public class MyBeanFactory {public static UserDao getUserDao(){//在实例化Bean之前我们可以进行一些业务逻辑操作return new UserDaoImpl();}
} beans!--指定执行自定义的Bean工厂的指定方法去实例化Bean--bean iduserDao1 classcom.zmt.factory.MyBeanFactory factory-methodgetUserDao/beanbean iduserService classcom.zmt.service.impl.UserServiceImplproperty nameuserDao refuserDao/property/beanbean iduserDao classcom.zmt.dao.impl.UserDaoImpl/bean/beans 可以看到执行结果一个是通过无参构造器创建出来的Bean一个是通过自定义的静态工厂创建的。
实例工厂方法实例化Bean
与静态工厂方法实例化Bean区别在于我们需要将工厂类也加载为Bean对象然后通过该Bean对象去实例化
public class MyBeanFactory1 {public UserDao getUserDao(){//在实例化Bean之前我们可以进行一些业务逻辑操作return new UserDaoImpl();}
}
beans!--加载工厂Bean--bean idmyBeanFactory1 classcom.zmt.factory.MyBeanFactory1/bean!--通过工厂Bean去获取需要的对象--bean iduserDao2 factory-beanmyBeanFactory1 factory-methodgetUserDao/bean!--指定执行自定义的Bean工厂的指定方法去实例化Bean--bean iduserDao1 classcom.zmt.factory.MyBeanFactory factory-methodgetUserDao/beanbean iduserService classcom.zmt.service.impl.UserServiceImplproperty nameuserDao refuserDao/property/beanbean iduserDao classcom.zmt.dao.impl.UserDaoImpl/bean
/beans 实现FactoryBean规范延迟实例化Bean
//需要指定FactoryBean的泛型
public class MyBeanFactory2 implements FactoryBeanUserDao {//该方法在执行getBean的时候去执行Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}//获取该Bean工厂产生的Bean类型Overridepublic Class? getObjectType() {return UserDao.class;}
} beans!--Bean名称是userDao3但加载的是工厂类--bean iduserDao3 classcom.zmt.factory.MyBeanFactory2/bean!--加载工厂Bean--bean idmyBeanFactory1 classcom.zmt.factory.MyBeanFactory1/bean!--通过工厂Bean去获取需要的对象--bean iduserDao2 factory-beanmyBeanFactory1 factory-methodgetUserDao/bean!--指定执行自定义的Bean工厂的指定方法去实例化Bean--bean iduserDao1 classcom.zmt.factory.MyBeanFactory factory-methodgetUserDao/beanbean iduserService classcom.zmt.service.impl.UserServiceImplproperty nameuserDao refuserDao/property/beanbean iduserDao classcom.zmt.dao.impl.UserDaoImpl/bean/beans 延迟加载Bean实际上是先加载了工厂Bean类当需要用到Bean时会从单例池中获取FactoryBean后调用该对象中的getObject()方法获取到真正的的Bean对象并将该Bean对象缓存在factoryBeanObjectCache中当使用到该Bean对象时从该Map中获取。
自动装配
我们通过编写property标签进行的注入叫做手动注入而自动装配是不需要编写property标签的而是在bean标签中使用autowire属性来实现自动注入aotuwire的值有两个byName、byType
byName通过属性名自动装配去匹配setXxx与idxxx是否一致byType通过Bean的类型从容器中匹配匹配出多个相同Bean类型时报错
UserServiceImpl存在一个setUserDao方法因此我们可以这么编写同样可以将属性注入到UserServiceImpl中
beansbean iduserService classcom.zmt.service.impl.UserServiceImpl autowirebyName/beanbean iduserDao classcom.zmt.dao.impl.UserDaoImpl/bean
/beans