zoukankan      html  css  js  c++  java
  • Spring(四)

    4.3 拓展方式注入

    我们可以使用p命名空间和c命名空间进行注入

     <?xml version="1.0" encoding="UTF-8"?>
     <beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:p="http://www.springframework.org/schema/p"
            xmlns:c="http://www.springframework.org/schema/c"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
             https://www.springframework.org/schema/beans/spring-beans.xsd">
     ​
         <!--p命名空间注入,可以直接注入属性的值:property-->
         <bean id="user" class="com.kuang.pojo.User" p:name="狂神" p:age="18"/>
     ​
         <!--c命名空间注入,通过构造器注入:construt-args-->
         <bean id="user2" class="com.kuang.pojo.User" c:name="狂神2" c:age="11"/>
     ​
     </beans>

    注意点:p命名和c命名空间不能直接使用,需要导入xml约束!

     xmlns:p="http://www.springframework.org/schema/p"
     xmlns:c="http://www.springframework.org/schema/c"
     12

    4.4 Bean的作用域

    1. 单例模式(Spring默认机制)

     <bean id="user2" class="com.kuang.pojo.User" c:name="狂神2" c:age="11" scope="singleton"/>

    2. 原型模式:每次从容器中get的时候,都会产生一个新对象

     <bean id="user2" class="com.kuang.pojo.User" c:name="狂神2" c:age="11" scope="prototype"/>
     ​

    3. 其余的request、session、application这些只能在web开发中使用到

    5、Bean的自动装配

    自动装配是Spring满足bean依赖的一种方式,Spring会在上下文中自动寻找,并自动给bean装配属性

    在Spring中有三种装配的方式

    1. 在xml中显示的配置

    2. 在java中显示的配置

    3. 隐式的自动装配bean

    5.1 测试

    环境搭建:一个人有两个宠物

    5.2 byName自定装配

     <bean id="cat" class="com.kuang.pojo.Cat"/>
     <bean id="dog" class="com.kuang.pojo.Dog"/>
     ​
      <!--
             byName : 会自动在容器上下文中查找,和自己对象set方法后面的值对应的bean_id
         -->
     <bean id="people" class="com.kuang.pojo.People" autowire="byName">
         <property name="name" value="狂神"/>
     </bean>

    5.3 byTpye自动装配

         <!--
             byName : 会自动在容器上下文中查找,和自己对象set方法后面的值对应的bean_id
             byType : 会自动在容器上下文中查找,和自己对象属性类型相同的bean
         -->
     <bean id="people" class="com.kuang.pojo.People" autowire="byType">
         <property name="name" value="狂神"/>
     </bean>

    小结:

    • byName的时候,需要保证所有bean的id唯一,并且这个bean需要和自动注入的属性的set方法的值一致

    • byType的时候,需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

    5.4 使用注解实现自动装配

    jdk1.5支持的注解,Spring2.5就支持注解了!

    要使用注解须知:

    1. 导入约束

    2. 配置注解的支持 context:annotation-config/

     <?xml version="1.0" encoding="UTF-8"?>
     <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:context="http://www.springframework.org/schema/context"
         xsi:schemaLocation="http://www.springframework.org/schema/beans
             https://www.springframework.org/schema/beans/spring-beans.xsd
             http://www.springframework.org/schema/context
             https://www.springframework.org/schema/context/spring-context.xsd">
     ​
         <context:annotation-config/>
     ​
     </beans>

    @Autowired

    直接在属性上使用即可,也可以在set方法上使用

    使用Autowired我们可以不用编写set方法了,前提是你这个自动装配的属性在 IOC(Spring)容器中存在,且符合名字byName

    科普:

     @Nullable   字段标记了这个注解,说明这个字段可以为null;
     1
     public @interface Autowired {
        boolean required() default true;
     }

    测试代码:

     public class People {
         //如果显示定义了Autowired的required属性为false,说明这个对象可以为Null,否则不允许为空
         @Autowired(required = false)
         private Cat cat;
         @Autowired
         private Dog dog;
         private String name;
     }

    如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired】完成的时候,我们可以使用@Qualifier(value = “xxx”)去配合@Autowire的使用,指定一个唯一的bean对象注入!

     public class People {
     ​
         @Autowired
         @Qualifier(value = "cat2")
         private Cat cat;
         @Autowired
         private Dog dog;
         private String name;
     }

    @Resource

     public class People {
     ​
         @Resource( name = "cat3")
         private Cat cat;
         @Resource
         private Dog dog;
         private String name;
     }

    小结:

    @Resource和@Autowired的区别:

    • 都是用来自动转配的,都可以放在属性字段上

    • @Autowired 是通过byType的方式实现,而且必须要求这个对象存在!【常用】

    • @Resource 默认通过byName的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!【常用】

    • 执行顺序不同: @Autowired 通过byType的方式实现。@Resource默认通过byName的方式实现。

  • 相关阅读:
    iphone 拨打电话的 两种方法-备
    vi编辑器经典技巧 -备
    iOS图片压缩问题
    NSStirng、NSArray、以及枚举(Method小集合)
    宏定义 button 方法 --备
    debug 输出 以及宏定义--备
    从别人写的 Object-C 中 Singleton (单例) 模式 中的一些理解--备
    makefile编写---.c .cpp 混合编译makefile 模板
    图像处理之基础---线性卷积和循环卷积的区别
    图像处理之基础---卷积去噪
  • 原文地址:https://www.cnblogs.com/ltw222/p/14910167.html
Copyright © 2011-2022 走看看