创建bean实例的3种方式
无参构造方法 的方式(默认)
- 编写类Bean1
- 编写配置
静态工厂实例化的方式:含有静态方法的工厂类
- 编写Bean2的静态工厂
- 配置
实例工厂实例化的方式:通过实例工厂获得实例(不需要实现或者继承任何接口或者父类)
- Bean3的实例工厂
- 配置
Spring IOC依赖注入后的bean放在哪
- Spring在初始化时,解析xml文件,将bean信息放在位于beanFactory的beanDefinitionMap中。依赖注入的时候,存放在factoryBeanObjectCache 的map中
Spring 的依赖注入
对于 Spring 程序, Spring 框架为我们提供一个 IoC 容器, 该容器负责创建对象和维护对象之间的依赖关系.
对于普通程序, 我们是通过对象本身来创建和解决自己的依赖问题.
ApplicationContext(新版本的工厂类) 即是 Spring 程序的 IoC 容器, 该容器负责创建 Bean, 并将功能类 Bean 注入到你需要的 Bean 中. 那么, Spring 是如何知道我们有哪些 Bean 类, 以及这些类的依赖关系是什么? 有三种配置方式告知 Spring 程序, 分别是 Xml 配置方式/注解配置方式/Java 配置方式.
ApplicationContext 是 Spring 程序的核心, 不管是 Spring 程序, 还是 Spring MVC 程序, 还是SpringBoot 程序, 其 main() 函数最主要的代码就是初始化了 ApplicationContext 容器, Spring 框架为我们提供了多种容器实现, 可以针对不同的应用场景选择.
- AnnotationConfigApplicationContext: 该容器读取从一个或多个基于 java 的配置类, 适用于 Java 配置方式;
- AnnotationConfigWebApplicationContext: 专门为 web 应用准备的, 适用于注解方式;
- XmlWebApplicationContext: 该容器读取一个或多个 Xml 配置文件,使用于 Xml 配置方式;
- ClassPathXmlApplicationContext, 该容器从 classpath 路径下读取 Xml 配置文件,使用于 Xml 配置方式.
//ApplicationContext context = new ClassPathXmlApplicationContext("resouces/applicationContext.xml");
//ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class);
将Spring配置到应用开发中有以下三种方式(三种 Bean 配置方式)
-
Xml 配置方式: 老的程序中经常见到, 比如将 Spring bean 声明放到 applicationContext.xml 中.
- xml配置bean注入方式详解
- web.xml的加载顺序
- 两个阶段的bean配置注入:1.初始化通用上下文、2.初始化WebMVC(SpringMVC)上下文
- xml配置bean例子:这两个阶段,基本上都是配置“第三方bean”
- web.xml的加载顺序
- xml配置bean注入方式详解
-
注解配置方式: 在类定义时通过@Service, @Controller, @Repository, @Component 声明为 Spring Bean.
@Service, 用于业务服务层
@Controller, 用于展现层
@Repository, 用于 DAO 层
@Component, 通用组件, 它是上面 3 个注解的父注解, 没有明确的角色, 对于普通的组件最好使用@Component 注解
-
Java 配置方式: 该方式是通过@Configuration+@Bean 实现的
具体为, 该方式引入了一个 Config 类, 在类中通过方法函数声明 bean 对象, 而 Pojo 类定义不加@Component 之类的注解, Config 类需要加上@Configuration 注解, Config 类中的 bean 方法需要加上@Bean 注解.
@Configuration 等同于 xml 配置中的<beans> </beans>
标签, 需说明的是@Component 其实也是@Component 的一个子注解,
@Bean 等同于 xml 配置中的<bean> </bean>
标签. @Bean 用来注解一个函数, 该函数应该一个 Bean 对象, Bean 对象的名称是方法名.
最佳实践: 注解配置方式和 Java 配置方式没有孰优孰劣, 理论上是可以相互替换的, 但可以总结一个最佳实践, 全局性的配置使用 Java 配置 (比如数据库相关配置, MVC 相关配置), 业务 Bean 配置使用注解配置, 尽量少用 Xml 配置方式.