目录

  • 第一节 Spring依赖注入Bean属性(xml)
  • 1.1 手动装配,使用xml配置
  • 1. 通过构造方法注入
  • 2. 通过属性的setter方法注入
  • 3. 通过p命名空间注入【了解】
  • 1.2 SpEL表达式【了解】
  • 演示
  • 1.3 集合注入
  • List、Set、Map、Properties、数组
  • 1.4 注解注入
  • @Component使用案例
  • @Component("id")使用案例
  • 未使用注解的web-service-dao配置
  • 使用注解的web-service-dao配置


第一节 Spring依赖注入Bean属性(xml)

1.1 手动装配,使用xml配置

1. 通过构造方法注入

  1. 写一个Student类,提供get/set、toString、无参构造、2种不同的有参构造
  2. beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--通过构造方法注入属性的值-->
    <!--<bean class="com.it.model.Student" id="student">
        <!–这样写就调用的是2个string的构造方法–>
        <constructor-arg name="username" value="shu"></constructor-arg>
        <constructor-arg name="password" value="123"></constructor-arg>
    </bean>-->

    <!--<bean class="com.it.model.Student" id="student">
        <!–这样写就调用的是一个string 一个是int 的构造方法–>
        <constructor-arg name="username" value="shu"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
    </bean>-->

    <bean class="com.it.model.Student" id="student">
        <!--还可以通过索引加类型,给构造方法赋值-->
        <constructor-arg index="0" value="shu" type="java.lang.String"></constructor-arg>
        <constructor-arg index="1" value="18" type="int"></constructor-arg>
    </bean>

</beans>
  1. 效果

2. 通过属性的setter方法注入

  • setter方法有两种注入,一般使用第一种直观
  1. beans1.xml
  2. 效果

3. 通过p命名空间注入【了解】

  • 使用这种方法的类,必须要给属性提供get/set方法,否则报错
  1. beans2.xml
  2. 效果

1.2 SpEL表达式【了解】

  • SpEL:Spring 表达式
  • 对<property>进行统一编程,所有的内容都使用value。
  • <property name="" value="#{表达式}">
    #{123}、#{‘jack’} : 数字、字符串
    #{beanId} :另一个bean引用
    #{beanId.propName} :操作数据
    #{beanId.toString()} :执行方法
    #{T(类).字段|方法} :静态方法或字段

演示

  1. 提供Address属性的get/set方法、重写toString
  2. 提供Customer属性的get/set方法、重写toString(toString无需包含地址)
  3. beans3.xml
<?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"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--SpEL:spring表达式
      <property name="" value="#{表达式}">
          #{123}、#{'jack'} : 数字、字符串
          #{beanId}	:另一个bean引用
          #{beanId.propName}	:操作数据
          #{beanId.toString()}	:执行方法
          #{T(类).字段|方法}	:静态方法或字段
    -->
    <!--创建一个地址对象-->
    <bean class="com.it.model.Address" id="address">
        <property name="name" value="北京"></property>
    </bean>

    <bean class="com.it.model.Customer" id="customer">
        <!--<property name="name" value="shu"></property>-->
        <!--这样写的好处是能调用方法-->
        <property name="name" value="#{'shu'.toUpperCase()}"></property>

        <!--还可以将address.name 地址名赋值给客户名(操作数据的一种写法)-->
        <!--<property name="name" value="#{address.name}"></property>-->

        <!--<property name="pi" value="3.14"></property>-->
        <!--调用静态方法 Math.PI-->
        <property name="pi" value="#{T(java.lang.Math).PI}"></property>

        <!--一个对象引用另外一个对象的两种写法:-->
        <!--1.ref引用-->
        <!--<property name="address" ref="address"></property>-->
        <!--2.使用spel 在Customer中引用了另外一个(Address)bean-->
        <property name="address" value="#{address}"></property>

    </bean>

</beans>
  1. 效果

1.3 集合注入

  • 集合的注入都是给<property>添加子标签
  • 数组:<array>
    List:<list>
    Set:<set>
    Map:<map> ,map存放k/v 键值对,使用<entry>描述
    Properties:<props> <prop key=" "></prop> </props>
  • 普通数据:<value>
  • 引用数据:<ref>

List、Set、Map、Properties、数组

  1. 写个Programmer程序员类,提供以下集合与数组的get/set方法
  2. beans4.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--通过bean集合注入-->
    <bean class="com.it.model.Programmer" id="programmer">
        <property name="cars">
            <!--list集合的注入-->
            <list>
                <value>奔驰</value>
                <value>宝马</value>
                <value>ofo</value>
            </list>
        </property>

        <property name="pats">
            <!--set集合的注入-->
            <set>
                <value>大黄</value>
                <value>哈士奇</value>
                <value>蓝猫</value>
            </set>
        </property>

        <property name="infos">
            <!--map集合的注入-->
            <map>
                <entry key="name" value="shu"></entry>
                <entry key="password" value="123"></entry>
                <entry key="age" value="18"></entry>
            </map>
        </property>

        <property name="mysqlInfos">
            <!--properties的注入-->
            <props>
                <prop key="url">mysql:jdbc://localhost:3306/spring_day02</prop>
                <prop key="username">root</prop>
                <prop key="password">root</prop>
            </props>
        </property>

        <property name="members">
            <!--数组注入-->
            <array>
                <value>father</value>
                <value>mother</value>
                <value>sister</value>
            </array>
        </property>
    </bean>

</beans>
  1. 效果

1.4 注解注入

  • 注解:就是一个类使用@注解名称
    开发中:使用注解 取代 xml配置文件

@Component使用案例

  • @component取代:<bean class="">
  1. 在UserServiceImpl上添加一个@Component
  2. beans5.xml配置,使用这种方法需要开启注解和配置注解扫描的位置
  3. 使用与效果(成功注入值)

@Component(“id”)使用案例

  • @Component(“id”)取代: <bean id="" class="">
  1. 在UserServiceImpl上添加一个@Component(“userService”)
  2. beans5.xml配置同上,开启注解和配置注解位置即可
  3. 使用与效果(值同样注入成功)

未使用注解的web-service-dao配置

  1. dao实现类(简单的使用,暂不使用数据库)
  2. service实现类(userDao通过spring赋值)
  3. web-action的使用(userService通过spring赋值)
  4. beans6.xml配置
  5. 使用与效果

使用注解的web-service-dao配置

  • web开发,提供3个@Component注解衍生注解(功能一样)取代<bean class="">
    @Repository(“名称”):dao层
    @Service(“名称”):service层
    @Controller(“名称”):web层

    @Autowired:自动根据类型注入
    @Qualifier(“名称”):指定自动注入的id名称
    @Resource(name=“名称”):@Autowired与@Qualifier(“名称”)的结合

    @Scope(“prototype”):多例,默认是单列singleton

    @ PostConstruct 自定义初始化
    @ PreDestroy 自定义销毁
  1. 在dao实现类上使用@Repository注解
  2. 在service实现类上使用@Service注解,在userDao上使用@Autowired自动根据类型注入
  3. 在UserAction上使用@Controller注解,表示web层
  4. beans7.xml配置,只需开启注解与配置扫描注解即可
  5. 效果相同,使用方便、快捷
  6. @Qualifier(“名称”)的使用(指定自动注入的id名称)
    UserAction中:
    UserServiceImpl中:
  7. @Resource(name=“名称”)的使用
  8. @Scope(“prototype”)(多例,默认是单列singleton)的使用
    不配置,默认是单列的,从spring容器中获取UserAction类的对象,是同一个

    配置后,是多例的,每次获取都会返回一个新的对象


    相当于之前在beans.xml中配置的单列、多例
  9. @ PostConstruct 自定义初始化与@ PreDestroy 自定义销毁的使用
    在UserDao的实现类中配置:

    注意要使用context调用关闭容器close的方法,才会执行自定义销毁方法