BeanFactory和ApplicationContext的区别

ApplicationContext 方式加载:创建容器的同时 容器初始化,容器所有的bean创建完毕

               Spring容器中获取一个对象 通过类型直接获取

BeanFactory 方式加载:创建容器对象,BeanFactory当调用getBean获取响应对象是才创建对象

            Spring容器中获取一个对象 通过类型直接获取

这两个区别是一个容器加载的时候实例化对象,一个是在使用的时候才实例化对象。

静态工厂注入:

1、创建静态工厂类,定义一个工厂方法,new一个对象

2、<!-- 注册静态工厂 -->

  <bean class="com.sxt.factory.UserFactory" factory-method="getInstance" id="user"/>

在一些第三方框架使用过程中,可能不得不使用静态工厂注入或者实例工厂注入

HttpUrlConnection、HttpClient、OkHttp

动态工厂注入:

1、创建动态工厂类,定义一个工厂方法,new一个对象

2、

<!-- 实现动态工厂 -->

<bean class="com.sxt.factory.UserFactory" id="userFactory"/>

<bean factory-bean="userFactory" factory-method="getInstance" id="user"/>

属性注入

1、构造注入

创建有参构造方法,同时必须提供无参构造方法

     <bean class="com.bb.pojo.User">
         <!-- 通过构造注入的方式 初始化属性 -->
         <constructor-arg name="id" value="1001"/>
         <constructor-arg name="userName" value="张三"/>
         <constructor-arg name="address" value="深圳"/>
     </bean>

2、设置注入

有参构造方法不是必须的了,无参方法是必须的!!!

set方法注入就是利用对象属性的set方法给属性赋值,实际上,相当于首先使用无参构造方法创建一个Book对象,然后调用对象中的set方法给各个属性赋值。

设置注入必须添加对应的set()的方法

     <bean class="com.bb.pojo.User">
         <!-- 通过设值注入的方式 初始化属性 -->
         <property name="id" value="1003"/>
         <property name="userName" value="王五"/>
         <property name="address" value="固戍"/>
     </bean>

P名称空间注入

p名称空间注入本质上还是set方法注入,只是写法不同(注意:p名称空间注入,需要有无参构造方法)。

<bean class="com.bb.pojo.User" p:id="1004" p:userName="赵六" p:address="西乡"/>

对象注入

     <bean class="com.bb.pojo.Cat" id="myCat">
         <property name="nick" value="小黑"/>
         <property name="color" value="黄色"/>
     </bean>

数组和集合注入

数组和集合的注入方式是一致的,无论是基本数据类型还是一个引用,注入方式都是一样。 首先声明一个对象,对象中包含集合和数组。

        <!-- 数组类型 -->
         <array>
             <value>LOL</value>
             <value>CF</value>
             <value>DNF</value>
         </array>
         </property>
         <property name="cats">
         <!-- List类型 -->
         <list>
             <ref bean="myCat"/>
             <ref bean="myCat"/>
             <ref bean="myCat"/>
         </list>
         </property>

Map注入

<property name="maps">
         <!-- map类型 -->
         <map>
             <entry key="c1" value-ref="myCat"></entry>
             <entry key="c2" value-ref="myCat"></entry>
             <entry key="c3" value-ref="myCat"></entry>
         </map>
 </property>

Props注入

<property name="props">
   <props>
    <prop key="url">http://192.168.0.135</prop>
    <prop key="userName">admin</prop>
    <prop key="password">123</prop>
   </props>

</property>

控制反转注入

1·在spring容器中加载dao层的实现类

<!-- 配置Dao -->
     <bean class="com.bb.dao.impl.UserDaoImpl" id="userDaoImpl"/>

2·在业务层的实现类中使用set()方法注入dao层实现类

<!-- 配置service -->
     <bean class="com.bb.service.impl.UserServiceImpl" id="userServiceImpl">
         <property name="dao" ref="userDaoImpl"/>
     </bean>

3·在控制层中使用set()方法注入service层实现类

<!-- 配置controller -->
     <bean class="com.bb.controller.UserController">
         <property name="userService" ref="userServiceImpl"/>
     </bean>

JavaConfig配置(Java代码+注解)

@Configuration:表示该java类就是一个配置类相对于applicationContext.xml(放在类上)

@Bean("name"):相对于我们在applicationContext.xml文件中的bean标签 name默认的是方法名称(放在方法上)

JavaConfig + @Profile配置

@Profile:Spring中提供实现动态生成相应的bean

xmlConfig + @Profile

<!-- profile配置  注意写在文件的底部 -->
     <beans profile="dev">
         <bean class="com.bb.pojo.DataSource">
             <!-- 通过设值注入的方式 -->
             <property name="url" value="http://dev..."/>
             <property name="username" value="admin"/>
             <property name="password" value="123456"/>
         </bean>
     </beans>

xmlConfig + annotation

<!-- 开启扫描、开启注解 -->
     <context:component-scan base-package="com.bb.pojo"/>

@Component("user")等价 配置文件中<bean>标签 默认的name是类名首字母小写,一般用在身份不明的组件上

  <bean class="com.bb.pojo.User" name="user"/>

@Controller  一般在控制层使用的注解

@Service  一般在业务层使用的注解

@Repository  一般在dao层使用的注解

JavaConfig + annotation

@ComponentScan主要就是定义扫描的路径从中找出标识了需要装配的类自动装配到spring的bean容器中

总结一下@ComponentScan的常用方式如下

  • 自定扫描路径下边带有@Controller,@Service,@Repository,@Component注解加入spring容器

  • 通过includeFilters加入扫描路径下没有以上注解的类加入spring容器

  • 通过excludeFilters过滤出不用加入spring容器的类

  • 自定义增加了@Component注解的注解方式

BeanFactory和ApplicationContext的区别+部分Spring的使用的更多相关文章

  1. Spring中的BeanFactory和ApplicationContext的区别

    我用一个例子去测试BeanFactory和ApplicationContext的区别 首先建立一个bean public class User { //声明无参构造,打印一句话,监测对象创建时机 pu ...

  2. Spring中BeanFactory与ApplicationContext的区别

    BeanFactory:Bean工厂接口,是访问Spring Bean容器的根接口,基本Bean视图客户端.从其名称上即可看出其功能,即实现Spring Bean容器的读取. ApplicationC ...

  3. BeanFactory 和 ApplicationContext的区别

    今天在网上查资料无意中看到这一行代码 BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext ...

  4. BeanFactory和ApplicationContext的区别(Bean工厂和应用上下文)

    https://blog.csdn.net/qq_20757489/article/details/88543252 https://blog.csdn.net/pythias_/article/de ...

  5. 面试还不知道BeanFactory和ApplicationContext的区别?

    接口 BeanFactory 和 ApplicationContext 都是用来从容器中获取 Spring beans 的,但是,他们二者有很大不同 我看到过很多问 BeanFactory 和 App ...

  6. BeanFactory和ApplicationContext的区别

     1.BeanFactory和ApplicationContext的异同点: 相同点:     两者都是通过xml配置文件加载bean,ApplicationContext和BeanFacotry相比 ...

  7. 【Spring】3、BeanFactory 和 ApplicationContext的区别

    转自:http://blog.csdn.net/intlgj/article/details/5660587 在spring中,两个最基本最重要的包是 org.springframework.bean ...

  8. 阶段3 2.Spring_03.Spring的 IOC 和 DI_5 BeanFactory和ApplicationContext的区别

    核心容器的两个接口.ApplicationContext和BeanFactory 怎么知道对象被创建了呢 我们只需要在实现类里面构造函数内打印输出一段话 然后再这里加上一个断点 运行程序,光标停在这个 ...

  9. Spring中BeanFactory和ApplicationContext的区别

    1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期. 2. ApplicationContext除了提供上述BeanF ...

随机推荐

  1. luogu题解P4198楼房重建--线段树神操作

    题目链接 https://www.luogu.org/problemnew/show/P4198 分析 一句话题意,一条数轴上有若干楼房,坐标为\(xi\)的楼房有高度\(hi\),那么它的斜率为\( ...

  2. Yali7月集训Contest2 T1 Cube 题解

    题目链接: 连我们都只有纸质题目...话说雅礼集训都是这样的吗... 大意 0维基本图形是一个点 1维基本图形是一条线段 2维基本图形是一个正方形 3维基本图形是一个正方体 4维基本图形是... 求\ ...

  3. warning LNK4076: 无效的增量状态文件“../×××.ilk”;正在非增量链接

      VS编译警告:warning LNK4076: 无效的增量状态文件“../×××.ilk”;正在非增量链接 解决方法:删除程序提示的输出目录的×××.ilk,重新编译,即可

  4. Linux之用户相关操作

    1. 创建用户 useradd -m wolf #即创建一个用户并且创建同名的家目录 2. 设置密码 passwd wolf

  5. Mycat1.6启动报NumberFormatException解决方案(server内存太大)

    https://blog.csdn.net/lijieshare/article/details/84826280 2019-09-02 18:28:27,829 [ERROR][main] 2019 ...

  6. 第二章·Elasticsearch内部分片及分片处理机制介绍

    一.副本分片介绍 什么是副本分片? 副本分片的主要目的就是为了故障转移,如果持有主分片的节点挂掉了,一个副本分片就会晋升为主分片的角色. 在索引写入时,副本分片做着与主分片相同的工作.新文档首先被索引 ...

  7. 第三章·Logstash入门-部署与测试

    1.Logstash环境准备与安装 Logstash环境准备 关闭防火墙 #CentOS6 关闭防火墙 [root@elkstack01 ~]# /etc/init.d/iptables stop # ...

  8. deep_learning_Function_sklearn.preprocessing.LabelBinarizer()

    在多数的机器学习比赛中,给出的标签都是非数字化的,所以我们需要对其进行转换.代码如下: from sklearn import preprocessing feature = [[0,1], [1,1 ...

  9. JLINK驱动版本更换

    https://www.segger.com/downloads/jlink/JLink_Windows_V644b.exe 官网版本 Jlink的版本目录C:\Keil_v5\ARM\Segger\ ...

  10. 1.Nginx安装

    1.Nginx安装配置 Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发的高性能 Web和 反向代理服务器,也是一个 IMAP/POP3/ ...