Spring-OC&DI


1.スプリングの概要
1.1フレームの概要
フレームは多くの機能とモジュールを実装したプログラムの半完成品です。
多くのツールを組み合わせたツールバッグとして理解できます。
1.2 Springとは何ですか
Springは階層的なJava SE/EE応用full-stackライト級のオープンソースフレームである。Javaが開発したソウルフレームです。
Springには大きなカーネルが二つあります。
IOC(Inverse Of Control:制御反転)
AOP(Asppect Oriented Prograamming:面に向かってプログラミングする)
1.3 Spring機能
*IOC:**制御反転とは、オブジェクトの創建権をspringに渡し、Springが作成対象を担当してくれます。
DI:注入に依存していますが、対象のメンバー変数に値を付けます。
****AOP:**面に向かってプログラミングして、下の階は動的代理です。
事務:Springは声明式の事務を提供しています。つまり、構成によって事務を追加することができます。
2.spring快速入門
①Spring開発の基本パッケージ座標の導入
②Daoインターフェースと実現類の作成
③Springコアプロファイルの作成
④SpringプロファイルにUserDaoImplを配置する
⑤Springを使用したAPIでビーンの実例を得る
2.1 Spring開発の基本パッケージ座標の導入
<properties>
	<spring.version>5.0.5.RELEASEspring.version>
properties>

<dependencies> 
    <dependency>  
        <groupId>org.springframeworkgroupId> 
        <artifactId>spring-contextartifactId> 
        <version>${spring.version}version>
    dependency>
dependencies>

2.2 Daoインターフェースと実現類の作成
public interface UserDao {  
    public void save();
}

public class UserDaoImpl implements UserDao {  
    @Override  
    public void save() {
        System.out.println("UserDao save method running....");
	}
}
2.3 Springコアプロファイルを作成する
クラスパスでaplication Contect.xmlプロファイルを作成します。

<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">
beans>
2.4 SpringプロファイルにUserDaoImplを配置する
<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">
    
   
   <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">bean>
    
beans>

2.5 Springを使用したAPIは、Benの実例を得る。
@Test
public void test1(){
    //  spring    。  spring    
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    //  spring    userDao  
    UserDao userDao = (UserDao) ac.getBean("userDao");
    //    
    userDao.save();
}
3.Springプロファイル
3.1ビーンラベル基本配置
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">bean>
*id:**Beanの例Spring容器における一意の識別
*class:***Beanの全限定名称
3.2ビーンラベル範囲配置
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl" scope="singleton" >bean>
*scope:**は対象の作用範囲を指し、以下の値を取る。
取得範囲
説明
シングルトン
標準の値、単一の例、すぐに読み込みます。
プロトタイプ
複数例の遅延荷重
request
WEBプロジェクトでは、SpringがBeanのオブジェクトを作成し、requestドメインにオブジェクトを預けます。
セッション
WEBプロジェクトでは、SpringがBeanのオブジェクトを作成し、sessionドメインにオブジェクトを預けます。
global session
WEBプロジェクトでは、Portlet環境に適用し、Portlet環境がなければ、global Sessionはsessionに相当します。
3.3ビーンライフサイクル配置
*init-method:**クラスの初期化方法名を指定し、オブジェクトが作成されたときに、この方法を呼び出します。
**destroy-method:**指定されたクラスの廃棄方法の名前は、オブジェクトが破壊された場合に呼び出します。
3.4ビーンの実用化の3つの方法
1)無参構造法を用いた実証化
無参構造法をデフォルトで呼び出してオブジェクトを作成しましたが、beanにデフォルトの無参画関数がないと作成に失敗しました。
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
2)工場の静的方法の具体化
//   
public class StaticFactoryBean {
    //    ,         
    public static UserDao createUserDao(){    
    	return new UserDaoImpl();
    }
}

<bean id="userDao" class="com.itheima.factory.StaticFactoryBean" 
      factory-method="createUserDao" />
3)工場の実例的な方法の実証化
//   
public class DynamicFactoryBean {  
    //     ,           ,          ,    
	public UserDao createUserDao(){        
		return new UserDaoImpl(); 
	}
}

<bean id="factoryBean" class="com.itheima.factory.DynamicFactoryBean"/>

<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>
4.依存注入
4.1概要
依存注入(Dependency Injection):SpringIOCの具体的な体現であり、簡単に言えば、対象の属性に値を付けることである。
4.2ビーンの依存注入方式
4.2.1構造方法の割当値
①クラスに参画構造を提供する
public class UserServiceImpl implements UserService {	
    private UserDao userDao;

    public UserServiceImpl(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void save() {
        userDao.save();
    }
 }
②Spring容器を配置し、参照構造がある場合に注入する
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    
    <constructor-arg name="userDao" ref="userDao">constructor-arg>
bean>
4.2.2 set方法の割当値
①UserServiceImplにsetsUserDao方法を追加する
public class UserServiceImpl implements UserService {
    private UserDao userDao;
 
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
    } 
    
    @Override    
    public void save() {      
   		 userDao.save();
	}
}
②Spring容器をセットしてセット方法を呼び出して注入する
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    
	<property name="userDao" ref="userDao"/>
bean>
4.3ビームの依存注入のデータタイプ
4.3.1注入タイプの分類
Springの依存注入(つまりメンバー変数への値付け)は、3つのタイプに分けることができます。
  • 一般データタイプ
  • 参照データタイプ
  • セットのデータタイプ
  • これらの3つのタイプはいずれも「setメソッドの割当」を使用しても良いし、「構造方法の割当」を使用しても良いし、以下では「set方法の割当」を例にしてプレゼンテーションを行う。
    4.3.2一般データタイプの注入
    public class UserDaoImpl implements UserDao {
    	private String company;
        private int age;
        public void setCompany(String company) {
            this.company = company;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public void save() {
            System.out.println(company + "==="  +age);
        }
    }
    
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
        <property name="company" value="    ">property>
        <property name="age" value="15">property>
    bean>
    
    4.3.3参照データタイプの注入
    public class UserServiceImpl implements UserService {
        private UserDao userDao;
     
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;  
        } 
        
        @Override    
        public void save() {      
       		 userDao.save();
    	}
    }
    
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
    <bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
    	<property name="userDao" ref="userDao"/>
    bean>
    
    4.3.4集合データタイプの注入
    (1)Listの注入
    public class UserDaoImpl implements UserDao {
    	private List<String> strList;
    	public void setStrList(List<String> strList) {
    		this.strList = strList;
    	}
    	public void save() {
            System.out.println(strList);
            System.out.println("UserDao save method running....");
    	}
    }
    
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
        <property name="strList">
            <list>
                <value>aaavalue>
                <value>bbbvalue>
                <value>cccvalue>
            list>
        property>
    bean>
    
    (2)集合データタイプ(List)の注入
    public class UserDaoImpl implements UserDao {
    	private List<User> userList;
    	public void setUserList(List<User> userList) {
            this.userList = userList;  
        }
        public void save() {
            System.out.println(userList);
            System.out.println("UserDao save method running....");
    	}
    }
    
    <bean id="u1" class="com.itheima.domain.User"/>
    <bean id="u2" class="com.itheima.domain.User"/>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
        <property name="userList">
            <list>
                <bean class="com.itheima.domain.User"/>
                <bean class="com.itheima.domain.User"/>
                <ref bean="u1"/>
                <ref bean="u2"/>       
            list>
        property>
    bean>
    
    (3)集合データタイプ(Map)の注入
    public class UserDaoImpl implements UserDao {
        private Map<String,User> userMap;
        public void setUserMap(Map<String, User> userMap) {
        	this.userMap = userMap;
        }    
        public void save() {      
            System.out.println(userMap);
            System.out.println("UserDao save method running....");
    	}
    }
    
    <bean id="u1" class="com.itheima.domain.User"/>
    <bean id="u2" class="com.itheima.domain.User"/>
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
        <property name="userMap">
            <map>            
                <entry key="user1" value-ref="u1"/>
                <entry key="user2" value-ref="u2"/>
            map>
        property>
    bean>
    
    (4)集合データタイプ(Propties)の注入
    public class UserDaoImpl implements UserDao {
        private Properties properties;
        public void setProperties(Properties properties) {
            this.properties = properties;
        }
    	public void save() {
    		System.out.println(properties);
    		System.out.println("UserDao save method running....");
    	}
    }
    
    <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
        <property name="properties">
            <props>
                <prop key="p1">aaaprop>
                <prop key="p2">bbbprop> 
                <prop key="p3">cccprop>
            props>
        property>
    bean>
    
    5.1他のプロファイルの導入(モジュール別開発)
    実際の開発では、Springの構成内容が非常に多く、これによりSpringの構成が煩雑で体積が大きいため、構成の一部を他の構成ファイルに分解することができ、Springの主な構成ファイルはimportラベルでロードされます。
    <import resource="applicationContext-xxx.xml"/>
    
    5.2 getBean()方法の使用
    //      ,  Spring    
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    // Spring         
    //  id="userService"   
    UserService us1 = (UserService)ac.getBean("userService");
    //     "UserService"   ,
    //  ,     , spring          "UserService"     
    UserService us2 = ac.getBean(UserService.class);
    //     "UserService",id "userService"   ,
    UserService us3 = ac.getBean("userService",UserService.class);