第二章节 使用Spring进行依赖注入 -p.c注入-Bean属性

目录

前言

1.Spring Ioc容器

1.1配置元数据

1.2配置和使用容器

1.依赖注入

1.1构造

1.2set注入

2.基于XML的自动装配

2.1根据名称:

2.2根据类型:

2.3根据构造自动注入

3.p命名空间注入c命名空间注入

3.1p命名空间注入

3.2c命名空间注入

4.Spring 文件中 Bean属性

scope



前言

推荐看书spring入门经典

未整理好

首先要使用spring进行依赖注入 什么是spring 什么是依赖 什么是注入 如何实现依赖注入的,如何通过代码实现的,具体方法

首先理解Spirng的核心 Spring Applicaton Framework  Ioc容器的概念

1.Spring Ioc容器

Spring Applicaton Framework  Ioc容器的概念

是一个容器,对应用程序,对象实例,初始化,装配提供Spring功能的容器

1.1配置元数据

配置元数据就是向Spring容器提供的信息,便于实例化Bean,并指定如何对这些Bean进行装配

Spring容器先获取应用程序编写的类与获取配置元数据结合创建装配Bean

三种配置元数据方法

XML配置

基于注解

基于Java的配置元数据

1.2配置和使用容器

使用方法

1.在独立的程序,直接编程

2,在Web应用程序中,使用声名方法借助于Web.xml配置

2.依赖注入

依赖注入,从代码中移出依赖组件的创建过程,并在IoC容器中管理组件

  • 依赖指的是对象和对象之间的关联关系。
  • 注入指的是一种数据传递行为,通过注入行为来让对象和对象产生关系。

依赖注入两种实现方式:

  • 第一种:set注入
  • 第二种:构造注入

2.1构造

核心原理:通过调用构造方法来给属性赋值

  • 通过下标
  • 可以通过参数名
  • 也可以不指定下标和参数名,可以类型自动推断。
<bean id="userDao" class="com.hu.dao.impl.UserDaoImpl"></bean>
<bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" >
       //这里的name  是构造方法上参数的名字  ref 是引用userDao对象
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
    </bean>

2.2set注入

通过property标签获取到属性名:userDao

通过属性名推断出set方法名:setUserDao

通过反射机制调用setUserDao()方法给属性赋值

property标签的name是属性名。

property标签的ref是要注入的bean对象的id。(通过ref属性来完成bean的装配,这是bean最简单的一种装配方式。装配指的是:创建系统组件之间关联的动作)

   <bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" >
        <property name="userDao" ref="userDao"></property>
    </bean>

注入基本类型

注入set集合

 <property name="phones">
            <set>
                <!--非简单类型可以使用ref,简单类型使用value-->
                <value>110</value>
                <value>110</value>
            </set>
        </property>

注入List集合

 <property name="list">
            <list>
                <value>铁锤</value>
                <value>张三</value>
                <value>狼</value>
            </list>
        </property>

注入Map集合

 <property name="addrs">
            <map>
                <!--如果key不是简单类型,使用 key-ref 属性-->
                <!--如果value不是简单类型,使用 value-ref 属性-->
                <entry key="2" value="上海浦东区"/>
                <entry key="3" value="深圳宝安区"/>
            </map>
        </property>

注入Properties

<property name="properties">
            <props>
                <prop key="driver">com.mysql.cj.jdbc.Driver</prop>
                <prop key="url">jdbc:mysql://localhost:3306/spring</prop>
                <prop key="username">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>

2.3循环依赖

2.4依赖解析过程

2.5重写Bean定义

2.6使用depends-on特性

2.7基于XML的自动装配

2.1根据名称:

  • UserService Bean中需要添加autowire="byName",表示通过名称进行装配。
  • UserService类中有一个UserDao属性,而UserDao属性的名字是aaa,对应的set方法是setUserDao(),正好和UserDao Bean的id是一样的。这就是根据名称自动装配。
userDao userDao ;
public void setUserDao(userDao userDao) {
   this.userDao = userDao;
    }


<bean id="userDao" class="com.hu.dao.impl.UserDaoImpl"></bean>

<bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" autowire="byName" >
    </bean>

2.2根据类型:

可以看到无论是byName还是byType,在装配的时候都是基于set方法的。所以set方法是必须要提供的。提供构造方法是不行的,

//不能给id 或者给id取名 与set方法中参数名称一致
 <bean id="userDao" class="com.hu.dao.impl.UserDaoImpl"></bean>

    <bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" autowire="byType" >
    </bean>

2.3根据构造自动注入

提供构造函数:无需关系引用的id

 <bean  class="com.hu.dao.impl.UserDaoImpl"></bean>

    <bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" autowire="constructor" >
    </bean>

3.p命名空间注入c命名空间注入

3.1p命名空间注入

目的:简化配置。

使用p命名空间注入的前提条件包括两个:

  • 第一:在XML头部信息中添加p命名空间的配置信息:xmlns:p="http://www.springframework.org/schema/p"
  • 第二:p命名空间注入是基于setter方法的,所以需要对应的属性提供setter方法。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:p="http://www.springframework.org/schema/p"
       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 id="customerBean" class="com.powernode.spring6.beans.Customer" p:name="zhangsan" p:age="20"/>

</beans>

3.2c命名空间注入

c命名空间是简化构造方法注入的。

使用c命名空间的两个前提条件:

第一:需要在xml配置文件头部添加信息:xmlns:c="http://www.springframework.org/schema/c"

第二:需要提供构造方法。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:c="http://www.springframework.org/schema/c"
       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 id="myTimeBean" class="com.powernode.spring6.beans.MyTime" c:year="1970" c:month="1" c:day="1"/>-->

    <bean id="myTimeBean" class="com.powernode.spring6.beans.MyTime" c:_0="2008" c:_1="8" c:_2="8"/>

</beans>

4.Spring 文件中 Bean属性

id:   bean在spring容器的唯一标识,spring容器中不可能同时存在两个相同的id。

class:   类的全限定名(类名+包名),用“.”号连接

name:  设置别名,在BeanFactory的getBean(“name”)中可以获取相应的bean。

autowire :   byType   byName 基于xml自动装配

destroy-method:它的作用是在销毁bean之前可以执行指定的方法。注意:必须满足scope=“singleton”,并且destroy方法参数个数不能超过1,并且参数类型只能为boolean。

init-method:它的作用是在创建一个bean之后调用该方法,初始化方法必须是一个无参方法。

lazy-init:       lazy-init 设置只对scop属性为singleton的bean起作用,

lazy-init=”false” 立即加载, 在spring启动时,立刻进行实例.

lazy-init=”true” 延迟加载 ,设置为true的bean将不会在ApplicationContext启动时提前被实例化,而是在第一次向容器通过getBean索取bean时实例化的。

scope

默认(scope="singleton)情况下,Bean对象的创建是在初始化Spring上下文的时候就完成的。

 <bean id="user" class="com.hu.pojo.User" scope="singleton">

执行这个ApplicationContext 创建对象了 单例
        ApplicationContext applicationContext  =
                new ClassPathXmlApplicationContext("spring-config.xml");

如果想让Spring的Bean对象以多例的形式存在,可以在bean标签中指定scope属性的值为:prototype,这样Spring会在每一次执行getBean()方法的时候创建Bean对象,调用几次则创建几次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值