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. python 列表反转

    反转: 将原列表反转,返回None: li = [1, 2, 3]li.reverse()print(li)# [3, 2, 1]1234不改变原列表,返回反转后的新列表: li = [1, 2, 3 ...

  2. java实现spark常用算子之TakeSample

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  3. springboot搭建web项目与使用配置文件

    目录 一.准备工作 二.创建基础web项目 1. maven配置 2.创建maven项目.配置pom.xml为web基础项目 3.编写启动类 4.使用maven打包 5.使用命令java -jar x ...

  4. mybatis-04【小结】

    mybatis-04[小结] 1.Mybatis 中 # 和 $ 的区别?#相当于对数据 加上 双引号,$相当于直接显示数据1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号. 如:o ...

  5. 服务器端升级为select模型处理多客户端

    流程图: select会定时的查询socket查询有没有新的网络连接,有没有新的数据需要读,有没有新的请求需要处理,一旦有新的数据需要处理,select就会返回,然后我们就可以处理相应的数据,sele ...

  6. D - Nested Segments CodeForces - 652D (离散化+树桩数组)

    D - Nested Segments CodeForces - 652D You are given n segments on a line. There are no ends of some ...

  7. Optimization Algorithms

    1. Stochastic Gradient Descent 2. SGD With Momentum Stochastic gradient descent with momentum rememb ...

  8. golang gin框架 集成swagger 自动生成文档

    goswagger github仓库 https://github.com/swaggo/swag 安装 swag cli 1.因为网络原因,先安装gopm 管理工具 go get -v -u git ...

  9. string::compare

    1. compare string (1) 4int compare (const string& str) const noexcept; substrings (2) int compar ...

  10. @Mapper和@Repository

    参考地址 https://www.cnblogs.com/jtfr/p/10962205.html 相同点 两者都是作用于dao上 不同点 @Repository需要在Spring中配置扫描地址,然后 ...