春の依存性注入
依存性注入の概念
依存性注入:依存性注入。それの具体的な実装の枠組みコアIOCばねです。準備中私たちのプログラムは、制御の反転により、春にオブジェクトを作成するが、コードが起こることができない状況に依存しません。IOCだけ彼らの依存度を減らすことが、排除されないデカップリング。例えば:私たちのビジネス層は、メソッドの永続化層を呼び出します。この依存関係は、ビジネス層と永続化層という、春を使用した後、春は維持することができます。簡単に言えば、それは取得する代わりに、私たち自身の、ビジネス層に入ってくるオブジェクトの永続化層のフレームワークを待つことです。
IOCの役割
プログラム間のカップリング(依存関係)を低減
依存関係管理:すべてのばねが維持されるようにした後
私たちのために春が提供する他のクラスの使用オブジェクトへの現在のクラスの必要性、で、私たちは、構成ファイルで説明する必要があります
依存関係のメンテナンス:それは依存性注入と呼ばれています。
依存性注入:データを注入することが可能な三つがある文字列との基本的なタイプ(コンフィギュレーションファイルまたは注釈ビーン上構成で)他のBeanタイプ複合型/コレクション型注入方法 3:最初の:コンストラクタを使用して提供される第二:提供するように設定方法を用いて、第三の:(コンテンツ明日)を提供するために使用注釈を
豆の.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
コンストラクタ・インジェクション
コンストラクタ、引数:タグが使用
位置タグが現れる:豆内部タグ
ラベル属性
タイプ:データのタイプが注入されるべきデータを指定するために使用される、データ型は、一つまたはコンストラクタパラメータの一部であります型
インデックス:コンストラクタへのインデックスの位置を特定する噴射パラメータ割り付けデータを指定するために使用されます。指標の位置はゼロで
指定指定されたコンストラクタパラメータの割り当ての名前共通:名前
=指示に三つ以上のパラメータ割り付けコンストラクタ===================
値:基本的な種類を提供するための文字列とデータ型は
REF:指定されたデータのための他のBeanタイプを。これは、コアIoCコンテナあっBeanオブジェクトの春に表示する意味します
利点:
Beanオブジェクトを取得する場合、注入データは、必見ですそれ以外の場合は、オブジェクトが正常に作成することができません。
短所:
Beanが少ないよりも、このデータも提供されなければならない場合にはそうすることを、我々は、オブジェクトを作成するときに、オブジェクトをインスタンス化される方法を変更。
豆の.xml
<bean id="accountService" class="com.itheima.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>
セットインジェクション法
プロパティ:に従ってラベル
、彼らが表示されます:豆内部タグ
ラベル属性
名:注射の際に呼び出された指定するメソッドの名前を設定
値:基本的な種類を提供するための文字列やデータ型は
REF:でBeanは、他のタイプのデータを指定することができます。これは、オブジェクトのコアIoCコンテナた豆の春に表示されるように参照する
利点を:
明確な制限はありません、あなたは直接オブジェクトの作成にデフォルトコンストラクタを使用することができます
:欠点を
メンバーが値を持たなければならない場合は、あなたがオブジェクトを取得メソッドが実装されていません設定することが可能です。
-beanの.xml
<bean id="accountService2" class="com.itheima.service.impl.AccountServiceImpl2">
<property name="name" value="TEST" ></property>
<property name="age" value="21"></property>
<property name="birthday" ref="now"></property>
</bean>
注入の複合型
コレクション型注入
タグ構造のリストを設定するには、注射のために:リストアレイセット
インジェクションマップ構造タグの1セットのために:マップは小道具
同じ構成を、ラベルを交換することができます
豆の.xml
<bean id="accountService3" class="com.itheima.service.impl.AccountServiceImpl3">
<property name="myStrs">
<set>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</set>
</property>
<property name="myList">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>
<property name="mySet">
<list>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</list>
</property>
<property name="myMap">
<props>
<prop key="testC">ccc</prop>
<prop key="testD">ddd</prop>
</props>
</property>
<property name="myProps">
<map>
<entry key="testA" value="aaa"></entry>
<entry key="testB">
<value>BBB</value>
</entry>
</map>
</property>
</bean>
IAccountService.java
package com.itheima.service;
/**
* 账户业务层的接口
*/
public interface IAccountService {
/**
* 模拟保存账户
*/
void saveAccount();
}
accountService.java
package com.itheima.service.impl;
import com.itheima.service.IAccountService;
import java.util.Date;
/**
* 账户的业务层实现类
*/
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);
}
}
accountService2.java
package com.itheima.service.impl;
import com.itheima.service.IAccountService;
import java.util.Date;
/**
* 账户的业务层实现类
*/
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);
}
}
accountService3.java
package com.itheima.service.impl;
import com.itheima.service.IAccountService;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.Map;
/**
* 账户的业务层实现类
*/
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) {
this.myStrs = myStrs;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public void setMyProps(Properties myProps) {
this.myProps = myProps;
}
public void saveAccount(){
System.out.println(Arrays.toString(myStrs));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps);
}
}
プレゼンテーション層プレゼンテーション層、通話のためのビジネス層をシミュレートするのClient.java
package com.itheima.ui;
import com.itheima.service.IAccountService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 模拟一个表现层,用于调用业务层
*/
public class Client {
/**
*
* @param args
*/
public static void main(String[] args) {
//1.获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据id获取Bean对象
// IAccountService as = (IAccountService)ac.getBean("accountService");
// as.saveAccount();
// IAccountService as = (IAccountService)ac.getBean("accountService2");
// as.saveAccount();
IAccountService as = (IAccountService)ac.getBean("accountService3");
as.saveAccount();
}
}