目录
[4.Spring 文件中 Bean属性](#4.Spring 文件中 Bean属性)
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是一样的。这就是根据名称自动装配。
XMLuserDao 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对象,调用几次则创建几次。