zoukankan      html  css  js  c++  java
  • BeanFactory和ApplicationContext的区别+部分Spring的使用

    BeanFactoryApplicationContext的区别

    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注解的注解方式

  • 相关阅读:
    消息队列RocketMQ版最佳实践订阅关系一致
    Java8 stream、List forEach 遍历对象 List 对某一字段重新赋值
    SQL的嵌套查询与连接查询
    Xshell7 个人可以申请免费使用正版
    @NotEmpty、@NotBlank、@NotNull 区别和使用
    List集合日常总结
    Time Zone(时区)
    Arrays.asList() 和Collections.singletonList()的区别
    GitBash生成SSH密钥
    Mysql中用SQL增加、删除、修改(包括字段长度/注释/字段名)总结
  • 原文地址:https://www.cnblogs.com/wdss/p/10928163.html
Copyright © 2011-2022 走看看