Spring是一个轻量级的DI/IoC和AOP容器的开源框架;
Spring主要是简化Java开发,其采用的策略有:
-
基于POJO的轻量级和最小侵入性编程;
-
基于依赖注入和面向接口实现松耦合;
-
基于切面和惯例进行声明式编程;
-
通过切面和模板减少样板式代码;
Spring容器:
- BeanFactory
- ApplicationContext
BeanFactory:
是Spring框架最核心的接口,它提供了高级IoC的配置机制;
是一个类工厂,可以创建并管理各种类的对象;
- 【getBean】 对应了多个方法来获取配置给 Spring IoC 容器的 Bean。
① 按照类型拿 bean:bean = (Bean) factory.getBean(Bean.class);
注意:要求在 Spring 中只配置了一个这种类型的实例,否则报错。(如果有多个Spring 就懵了,不知道该获取哪一个)
② 按照 bean 的名字拿 bean:bean = (Bean) factory.getBean("beanName");
注意:这种方法不太安全,IDE 不会检查其安全性(关联性)
③ 按照名字和类型拿 bean:(推荐)bean = (Bean) factory.getBean("beanName", Bean.class);
- 【isSingleton】 用于判断是否单例,如果判断为真,其意思是该 Bean 在容器中是作为一个唯一单例存在的。而【isPrototype】则相反,如果判断为真,意思是当你从容器中获取 Bean,容器就为你生成一个新的实例。
注意:在默认情况下,【isSingleton】为 ture,而【isPrototype】为 false - 关于 type 的匹配,这是一个按 Java 类型匹配的方式
BeanFactory的获取:
Resource resource=new ClassPathResource("applicationContext.xml");
BeanFactory beanFactory=new XmlBeanFactory(resource);
ApplicationContext:
该接口是由BeanFactory派生而来的,提供了更多面向实际应用的功能;
ApplicationContext 常见实现类:
1.ClassPathXmlApplicationContext:
读取classpath中的资源
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
2:FileSystemXmlApplicationContext:-
读取指定路径的资源
ApplicationContext ac = new FileSystemXmlApplicationContext("c:/applicationContext.xml");
3.XmlWebApplicationContext:
需要在Web的环境下才可以运行
XmlWebApplicationContext ac = new XmlWebApplicationContext(); // 这时并没有初始化容器
ac.setServletContext(servletContext); // 需要指定ServletContext对象
ac.setConfigLocation("/WEB-INF/applicationContext.xml"); // 指定配置文件路径,开头的斜线表示Web应用的根目录
ac.refresh(); // 初始化容器
ApplicationContext和BeanFactory区别:
-
BeanFactory在初始化容器时未实例化Bean,直到第一次访问时才实例化Bean;
-
ApplicationContext在初始化应用上下文时就已经实例化所用的Bean
//立即加载
/*ApplicationContext applicationContext=new ClassPathXmlApplicationContext("application.xml");
JavaTrad javaTrad=applicationContext.getBean("java",JavaTrad.class);
javaTrad.say();*/
//懒加载
/*Resource resource=new ClassPathResource("applicationContext.xml");
BeanFactory beanFactory=new XmlBeanFactory(resource);
JavaTrad javaTrad1=beanFactory.getBean("java",JavaTrad.class);
javaTrad1.say();*/