Spring-IOC的依赖注⼊的三种⽅式-使⽤构造函数提供+使⽤set⽅法提供+使⽤注
解提。。。
Spring-IOC的依赖注⼊
通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。ioc解耦只是降低他们的依赖关系,但不会消除。
例如:我们的业务层仍会调⽤持久层的⽅法。 那这种业务层和持久层的依赖关系,在使⽤ spring 之后,就让 spring 来维护了。 简单的说,就是坐等框架把持久层对象传⼊业务层,⽽不⽤我们⾃⼰去获取。
通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。ioc解耦只是降低他们的依赖关系,但不会消除。
例如:我们的业务层仍会调⽤持久层的⽅法。 那这种业务层和持久层的依赖关系,在使⽤ spring 之后,就让 spring 来维护了。 简单的说,就是坐等框架把持久层对象传⼊业务层,⽽不⽤我们⾃⼰去获取。
1.依赖注⼊
Dependency Injection。它是 spring 框架核⼼ ioc 的具体实现
IOC的作⽤:降低程序间的耦合(依赖关系)
依赖关系的管理:以后都交给spring来维护
在当前类需要⽤到其他类的对象,由spring为我们提供,我们只需要在配置⽂件中说明
依赖注⼊能注⼊的数据:有三类
基本类型和String,其他bean类型(在配置⽂件中或者注解配置过的bean),复杂类型/集合类型
注⼊的⽅式:有三种,前两种是xml配置注⼊,后⾯是注解
第⼀种:使⽤构造函数提供
第⼆种:使⽤set⽅法提供
第三种:使⽤注解提供
1构造函数注⼊
使⽤类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们⾃⼰做的,⽽是通过配置的⽅式,让spring 框架来为我们注⼊。
实现类
public class AccountServiceImpl implements AccountService {
//如果是经常变化的数据,并不适⽤于注⼊的⽅式
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);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xsi="/2001/XMLSchema-instance"
schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd">
<!-- spring中的依赖注⼊
依赖注⼊:
Dependency Injection
IOC的作⽤:
降低程序间的耦合(依赖关系)
依赖关系的管理:
以后都交给spring来维护
在当前类需要⽤到其他类的对象,由spring为我们提供,我们只需要在配置⽂件中说明
依赖关系的维护:
就称之为依赖注⼊。
依赖注⼊:
能注⼊的数据:有三类
基本类型和String
其他bean类型(在配置⽂件中或者注解配置过的bean)
复杂类型/集合类型
注⼊的⽅式:有三种
第⼀种:使⽤构造函数提供
第⼆种:使⽤set⽅法提供
第三种:使⽤注解提供(明天的内容)
-->
<!--构造函数注⼊:
使⽤的标签:constructor-arg
标签出现的位置:bean标签的内部
标签中的属性
type:⽤于指定要注⼊的数据的数据类型,该数据类型也是构造函数中某个或某些参数的类型
index:⽤于指定要注⼊的数据给构造函数中指定索引位置的参数赋值。索引的位置是从0开始
name:⽤于指定给构造函数中指定名称的参数赋值常⽤的
=============以上三个⽤于指定给构造函数中哪个参数赋值=============================== value:⽤于提供基本类型和String类型的数据
ref:⽤于指定其他的bean类型数据。它指的就是在spring的Ioc核⼼容器中出现过的bean对象优势:
在获取bean对象时,注⼊数据是必须的操作,否则对象⽆法创建成功。
弊端:
改变了bean对象的实例化⽅式,使我们在创建对象时,如果⽤不到这些数据,也必须提供。
-->
<bean id="accountService"class="cn.lj.service.impl.AccountServiceImpl">
<constructor-arg name="name"value="泰斯特"/>
<constructor-arg name="age"value="18"/>
<constructor-arg name="birthday"ref="now"/>
</bean>
<!-- 配置⼀个⽇期对象 -->
<bean id="now"class="java.util.Date"/>
</beans>
2.set⽅法注⼊,更常⽤的⽅式
对象类型和基本类型
public class AccountServiceImpl2 implements AccountService {
private String name;
private Integer age;
private Date birthday;
....set,get
}
<!-- set⽅法注⼊更常⽤的⽅式
涉及的标签:property
出现的位置:bean标签的内部
标签的属性
name:⽤于指定注⼊时所调⽤的set⽅法名称
value:⽤于提供基本类型和String类型的数据
ref:⽤于指定其他的bean类型数据。它指的就是在spring的Ioc核⼼容器中出现过的bean对象优势:
创建对象时没有明确的限制,可以直接使⽤默认构造函数
弊端:
如果有某个成员必须有值,则获取对象是有可能set⽅法没有执⾏。
-->
<bean id="accountService2"class="cn.lj.service.impl.AccountServiceImpl2">
<property name="name"value="TEST"/>
<property name="age"value="21"/>
<property name="birthday"ref="now"/>
</bean>
复杂类型的注⼊/集合类型的注⼊
public class AccountServiceImpl3 implements IAccountService {
private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps;
public void setMyStrs(String[] myStrs){
}
public void setMyList(List<String> myList){
}
public void setMySet(Set<String> mySet){
}
public void setMyMap(Map<String, String> myMap){
spring ioc注解}
public void setMyProps(Properties myProps){
}
public void saveAccount(){
System.out.String(myStrs));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps);
}
}
<!-- 复杂类型的注⼊/集合类型的注⼊
⽤于给List结构集合注⼊的标签:
list array set
⽤于个Map结构集合注⼊的标签:
map props
结构相同,标签可以互换
-->
<bean id="accountService3"class="cn.lj.service.impl.AccountServiceImpl3">
<!-- 在注⼊集合数据时,只要结构相同,标签可以互换 -->
<!-- 给数组注⼊数据 -->
<property name="myStrs">
<set>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</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="testC">ccc</prop>
<prop key="testD">ddd</prop>
</props>
</property>
<!-- 注⼊ properties 数据 -->
<property name="myProps">
<map>
<entry key="testA"value="aaa"/>
<entry key="testB">
<value>BBB</value>
</entry>
</map>
</property>
</bean>
3.注解注⼊
注解配置和 xml 配置要实现的功能都是⼀样 的,都是要降低程序间的耦合。只是配置的形式不⼀样。
3.1⽤于创建对象的,相当于:
@Component(id="",value="")
作⽤:把资源让 spring 来管理。相当于在 xml 中配置⼀个 bean。
属性:value:指定bean的 id。如果不指定value属性,默认bean的id是当前类的类名。⾸字母⼩写。
三层架构注解
@Controller-表现层
@Service-业务层
@Repository-持久层
细节:如果注解中有且只有⼀个属性要赋值时,且名称是 value,value 在赋值是可以不写。
3.2⽤于注⼊对象的 <property name="" value="" | ref=""/>
@Autowired
作⽤:⾃动按照类型注⼊。只要容器中有唯⼀的⼀个bean对象类型和要注⼊的变量类型匹配,就可以注⼊成功。如果ioc容器中没有任何bean的类型和要注⼊的变量类型匹配,则报错。
如果Ioc容器中有多个类型匹配时:可以是变量上,也可以是⽅法上,细节:在使⽤注解注⼊时,set⽅法就不是必须的了。
@Qualifier
作⽤:在按照类中注⼊的基础之上再按照名称注⼊。它在给类成员注⼊时不能单独使⽤。但是在给⽅法参数注⼊时可以
属性: value=""⽤于指定注⼊bean的id。
@Resource
作⽤:直接按照bean的id注⼊。它可以独⽴使⽤
属性:name=""⽤于指定bean的id。
@Value
作⽤:⽤于注⼊基本类型和String类型的数据
属性:value=""⽤于指定数据的值。它可以使⽤spring中SpEL(也就是spring的el表达式)
SpEL的写法:${表达式}
3.3⽤于改变作⽤范围的
@Scope
作⽤:⽤于指定bean的作⽤范围
属性:value-指定范围的取值。常⽤取值:singleton,prototype
3.4和⽣命周期相关
@PreDestroy 作⽤:⽤于指定销毁⽅法
@PostConstruct 作⽤:⽤于指定初始化⽅法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论