Spring依赖注入-p.c注入-Bean属性

目录

1.依赖注入

1.1构造

1.2set注入

2.基于XML的自动装配

2.1根据名称:

2.2根据类型:

2.3根据构造自动注入

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

3.1p命名空间注入

3.2c命名空间注入

[4.Spring 文件中 Bean属性](#4.Spring 文件中 Bean属性)

scope


1.依赖注入

依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。依赖注入:

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

依赖注入常见的实现方式包括两种:

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

1.1构造

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

  • 通过下标
  • 可以通过参数名
  • 也可以不指定下标和参数名,可以类型自动推断。
XML 复制代码
<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>

1.2set注入

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

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

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

property标签的name是属性名。

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

XML 复制代码
   <bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" >
        <property name="userDao" ref="userDao"></property>
    </bean>

注入基本类型

注入set集合

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

注入List集合

XML 复制代码
 <property name="list">
            <list>
                <value>铁锤</value>
                <value>张三</value>
                <value>狼</value>
            </list>
        </property>

注入Map集合

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

注入Properties

XML 复制代码
<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.基于XML的自动装配

2.1根据名称:

  • UserService Bean中需要添加autowire="byName",表示通过名称进行装配。
  • UserService类中有一个UserDao属性,而UserDao属性的名字是aaa,对应的set方法是setUserDao(),正好和UserDao Bean的id是一样的。这就是根据名称自动装配。
XML 复制代码
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方法是必须要提供的。提供构造方法是不行的,

XML 复制代码
//不能给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

XML 复制代码
 <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 复制代码
<?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 复制代码
<?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上下文的时候就完成的。

XML 复制代码
 <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对象,调用几次则创建几次。

相关推荐
2401_854391087 分钟前
城镇住房保障:SpringBoot系统功能概览
java·spring boot·后端
hummhumm8 分钟前
Oracle 第29章:Oracle数据库未来展望
java·开发语言·数据库·python·sql·oracle·database
wainyz17 分钟前
Java NIO操作
java·开发语言·nio
工业3D_大熊23 分钟前
【虚拟仿真】CEETRON SDK在船舶流体与结构仿真中的应用解读
java·python·科技·信息可视化·c#·制造·虚拟现实
lzb_kkk31 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
爬山算法1 小时前
Maven(28)如何使用Maven进行依赖解析?
java·maven
2401_857439691 小时前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧6661 小时前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索1 小时前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
芒果披萨1 小时前
Filter和Listener
java·filter