spring 的依赖注入

spring 的依赖注入

		1 依赖注入的概念
			依赖注入:Dependency Injection。它是 spring 框架核心 ioc 的具体实现。
			我们的程序在编写时,通过控制反转,把对象的创建交给了spring,但是代码中不可能出现没有
			依赖的情况。ioc解耦只是降低他们的依赖关系,但不会消除。

			依赖关系的管理:
		            以后都交给spring来维护
		        在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
		        依赖关系的维护:
		            就称之为依赖注入。
		         依赖注入:
		            能注入的数据:有三类
		                基本类型和String
		                其他bean类型(在配置文件中或者注解配置过的bean)
		                复杂类型/集合类型
		             注入的方式:有三种
		                第一种:使用构造函数提供
		                第二种:使用set方法提供
		                第三种:使用注解提供

			例如:我们的业务层仍会调用持久层的方法。	
		2 构造函数注入
			* AccountServiceImpl.java
				/**
				 * 账户的业务层实现类
				 */
				public class AccountServiceImpl implements IAccountService {

				    //如果是经常变化的数据,并不适用于注入的方式
				    private String name;
				    private Integer age;
				    private Date birthday;

				    public AccountServiceImpl(String name,Integer age,Date birthday){
				        this.name = name;
				        this.age = age;
				        this.birthday = birthday;
				    }

				    public void  saveAccount(){
				        System.out.println("service中的saveAccount方法执行了。。。"+name+","+age+","+birthday);
				    }
				}
			<!-- 使用构造函数的方式,给 service 中的属性传值
				方法:
					1.按照构造函数的参数的下标注入 index="0"
					2.按照构造函数的参数的类型     type="String"
					3.按照构造函数的参数的名称     name="sname" index="0"
				要求:
					类中需要提供一个对应参数列表的构造函数。
				涉及的标签:
					constructor-arg
						属性:
							index:指定参数在构造函数参数列表的索引位置
							type:指定参数在构造函数中的数据类型
							name:指定参数在构造函数中的名称 用这个找给谁赋值
							=======上面三个都是找给谁赋值,下面两个指的是赋什么值的=========
							value:它能赋的值是基本数据类型和 String 类型
							ref:它能赋的值是其他 bean类型,就是必须得是在配置文件中配置过的 bean

				优势:
		            在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
		        弊端:
			--> 
			<bean id="accountService" class="com.demos.service.impl.AccountServiceImpl"> 
				<constructor-arg name="name" value="张三"></constructor-arg> 
				<constructor-arg name="age" value="18"></constructor-arg> 
				<constructor-arg name="birthday" ref="now"></constructor-arg>
			</bean> 
			<bean id="now" class="java.util.Date"></bean>
		3 set 方法注入
			* AccountServiceImpl2.java
				/**
				 * 账户的业务层实现类
				 */
				public class AccountServiceImpl2 implements IAccountService {

				    //如果是经常变化的数据,并不适用于注入的方式
				    private String name;
				    private Integer age;
				    private Date birthday;

				    public void setName(String name) {
				        this.name = name;
				    }

				    public void setAge(Integer age) {
				        this.age = age;
				    }

				    public void setBirthday(Date birthday) {
				        this.birthday = birthday;
				    }

				    public void  saveAccount(){
				        System.out.println("service中的saveAccount方法执行了。。。"+name+","+age+","+birthday);
				    }
				}
			<!-- 通过配置文件给 bean 中的属性传值:使用 set 方法的方式
				涉及的标签:
					property
				属性:
					name:找的是类中 set 方法后面的部分
					ref:用于指定其他的bean类型数据。指的是spring的Ioc核心容器中出现过的bean对象
					value:给属性赋值是基本数据类型和 string 类型的
					实际开发中,此种方式用的较多。

				优势:
		            创建对象时没有明确的限制,可以直接使用默认构造函数
		        弊端:
		            如果有某个成员必须有值,则获取对象是有可能set方法没有执行。
				--> 
			<bean id="accountService" class="com.demos.service.impl.AccountServiceImpl"> 
				<property name="name" value="张三"></property> 
				<property name="age" value="21"></property> 
				<property name="birthday" ref="now"></property>
			</bean> 
			<bean id="now" class="java.util.Date"></bean>
		4 使用 p 名称空间注入数据(本质还是调用 set 方法)
			* 	此种方式是通过在 xml 中导入 p 名称空间,使用 p:propertyName 来注入数据,
				它的本质仍然是调用类中的set 方法实现注入功能。
			<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="accountService" 
					class="com.demos.service.impl.AccountServiceImpl4"
					p:name="test" p:age="21" p:birthday-ref="now"/>
				</beans>
			</bean>
		5 注入集合属性
			public class AccountServiceImpl implements IAccountService {
				private String[] myStrs;
				private List<String> myList;
				private Set<String> mySet;
				private Map<String,String> myMap;
				private Properties myProps;

				get和set方法
			}

			<!-- 注入集合数据
				List 结构的:
					array,list,set
				Map 结构的
					map(使用entry),props(使用prop)
			--> 

			<bean id="accountService" class="com.demos.service.impl.AccountServiceImpl">
				<!-- 在注入集合数据时,只要结构相同,标签可以互换 -->
				<!-- 给数组注入数据 --> 
				<property name="myStrs"> 
					<set>
						<value>AAA</value> 
						<value>BBB</value> 
						<value>CCC</value>
						<ref bean="bean 对象的id" />
					</set>
				</property>
				<!-- 注入 list 集合数据 --> 
				<property name="myList"> 
					<array> 
						<value>AAA</value> 
						<value>BBB</value> 
						<value>CCC</value>
					</array>
				</property>
				<!-- 注入 set 集合数据 --> 
				<property name="mySet"> 
					<list>
						<value>AAA</value> 
						<value>BBB</value> 
						<value>CCC</value>
					</list>
				</property>
				<!-- 注入 Map 数据 --> 
				<property name="myMap"> 
					<props> 
						<prop key="testA">aaa</prop> 
						<prop key="testB">bbb</prop>
					</props>
				</property>
				<!-- 注入 properties 数据 -->
				<property name="myProps"> 
					<map>
						<entry key="testA" value="aaa"></entry> 
						<entry key="testB"> 
							<value>bbb</value>
						</entry>
					</map>
				</property>
			</bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值