Spring学習(一)—入門


Springは何ですか
Springはオープンソースフレームであり、Springは2003年に興った軽量級Java開発フレームであり、Rod Johsonによって創建された.簡単に言えば、Springは階層的なJavaSE/EEfull-stack(ワンストップ式)の軽量級のオープンソースフレームである.strutsはwebフレームで、HibernateはO/RMフレームです.
Springは容器のフレームワークで、beanを調製し、beanとの関係を維持するためのフレームワークです.
Springに重要な概念があります.Bean(Javaのどのオブジェクトでも、javaBean、service、action、データソース、DAOなど)
IoC、制御反転、Inverse of Control、またはDI(Dependency Injection依存注入)
クイック入門
springプロジェクトを開発しました.ここで3.2.17版を使って簡単なMavenプロジェクトSpring Demoを作成します.pom.xmlに書き込みます.
 <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>3.2.17.RELEASE</version>
    </dependency>
springのコアファイルを作成します.appication Contect.xml(springのプロファイルで、デフォルトの名前で、他の名前も付けられます.)【hibernateはコアhiberg.cfg.xmlがあります.strutsコアファイルstruts.xml】は、このファイルは一般的にsrcディレクトリの下に配置されています.
<?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-3.2.xsd" >

.....
<!--   bean-->


</beans>
次は私達のテストコードを作成します.通常のjava開発において、プログラマはあるクラスで他の種類の方法に依存する必要があります.new依存クラスの再起動タイプの例の方法です.このような開発に存在する問題はnewのクラスのインスタンスが管理されにくいです.spring容器を通して事例を指定し、対象を必要とするクラスにインスタンスを注入する.注入依存の別の言い方は「制御反転」であり、一般的には我々newの一例であり、この例の制御権は我々プログラマであり、制御反転とはnewのインスタンスの動作は我々プログラマが行うのではなく、スプリング容器に任せることであると理解されている.私はこのシミュレーションプロジェクトの業務層とDao層springには注入に依存するさまざまな形態があります.ここでSet注入を使用しました.つまり、私達はもう具体的な種類の中で手動newオブジェクトを使用しません.これをspring操作setに渡してBiz層UserBiz.javaに注入します.
package com.lgh.spring.biz;

public interface UserBiz {
    public void save();

}
UserBizImpl.javaを実現
package com.lgh.spring.biz.impl;

import com.lgh.spring.biz.UserBiz;
import com.lgh.spring.dao.UserDao;

public class UserBizImpl implements UserBiz {

    private UserDao userDao;
    public UserBizImpl() {
        System.out.println("UserBizImpl     ");
    }

    @Override
    public void save() {
        System.out.println("UserBizImpl ------------");
        userDao.save();

    }
    public void setUserDao(UserDao userDao) {
        System.out.println("setUserDao set");
        this.userDao = userDao;
    }

}
Dao層:UserDao.java
package com.lgh.spring.dao;

public interface UserDao {

    void save();

}
UserDaoMysql Impl.java
package com.lgh.spring.dao.impl;

import com.lgh.spring.dao.UserDao;

public class UserDaoMysqlImpl implements UserDao {

    public UserDaoMysqlImpl() {
        System.out.println("UserDaoMysqlImpl     ");
    }

    @Override
    public void save() {
        System.out.println("UserDaoMysqlImpl save  ");

    }

}
準備ができました.私達はその後springのxmlファイルに配置してspringのxmlファイルを作成します.中のid属性はclass属性の別名で、クラスのフルネームをclass属性といいます.UserBizImpl.javaには公共属性のuserDaoがありますので、ラベルの中にラベル指定userDaoを作成します.ラベルのnameはUserBizImpl類のuserDao属性名で、refは以下を指しています.これは実際にspringがUserBizImplオブジェクトを実例化してUserBizImplのsetUserDaoメソッドを呼び出してuserDaoに注入します.
<bean id="userDao" class="com.lgh.spring.dao.impl.UserDaoMysqlImpl" lazy-init="true" >
</bean>
<bean id="userBiz" class="com.lgh.spring.biz.impl.UserBizImpl" lazy-init="true">
<property name="userDao" ref="userHib"></property>
</bean>
テスト:SpringTest 01.java
package com.lgh.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.lgh.spring.biz.UserBiz;

public class SpringTest01 {

   public static void main(String[] args) {
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

    UserBiz userBiz = (UserBiz) ac.getBean("userBiz");
    userBiz.save();
   }

}
実行結果:
UserBizImpl     
UserDaoMysqlImpl     
setUserDao set
UserBizImpl ------------
UserDaoMysqlImpl save  
その結果、私たちはspringがオブジェクトの作成を手伝ってくれる時に、実現類の構造方法コンストラクタ注入を呼びかけたのを見ました.この方式の注入はパラメータを持ったコンストラクタ注入を指し、上の例を修正して、二つのメンバー変数userDaoを作成しましたが、対象のset方法が設定されていないので、最初の注入方式をサポートできません.ここでの注入方式はUserBizImplのコンストラクターに注入されます.つまりUserBizImplオブジェクトを作成する時にuserDaoパラメータ値を入力します.
package com.lgh.spring.biz.impl;

import com.lgh.spring.biz.UserBiz;
import com.lgh.spring.dao.UserDao;

public class UserBizConstrImpl implements UserBiz {

    private UserDao userDao;
    public UserBizConstrImpl(UserDao userDao) {
        this.userDao = userDao;
        System.out.println("        "); 
    }

    @Override
    public void save() {

        userDao.save();

    }


}
XMLファイルでは同じ形式ではなく、ラベルを使っています.ref属性は他のラベルのID属性を指しています.
<bean id="userConBiz" class="com.lgh.spring.biz.impl.UserBizConstrImpl" lazy-init="true">
 <!--(2)       ,                   -->  
        <constructor-arg ref="userDao"></constructor-arg>  
</bean>
テスト:
package com.lgh.spring.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.lgh.spring.biz.UserBiz;

public class SpringTest04 {

   public static void main(String[] args) {
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");

    UserBiz userBiz = (UserBiz) ac.getBean("userConBiz");
    userBiz.save();
   }

}
UserDaoMysqlImpl     
        
UserDaoMysqlImpl save  
構造方法で伝達されるパラメータが複数ある場合、構造方法のパラメータの不確実性を以下の方法で解決できます.次にindexを設定します.パラメータの位置です.
<bean id="userConBiz" class="com.lgh.spring.biz.impl.UserBizConstrImpl" lazy-init="true">
 <!--(2)       ,                   -->  
        <constructor-arg index="0" ref="userDao"></constructor-arg>  
        <constructor-arg index="1" ref="user"></constructor-arg>  
</bean>
もう一つは設定パラメータタイプです.
    <constructor-arg type="java.lang.String" ref=""/> 
パラメータが非文字列タイプの場合は、設定ファイルでタイプを指定する必要があります.指定されていない場合は、すべて文字列タイプに従って値を割り当てます.
パラメータタイプが一致しない場合は、フレームは文字列の種類によって検索されますので、設定ファイルでパラメータの位置を指定する必要があります.