1. 程式人生 > >SeaSar2之通過自動注入的方式管理Bean-yellowcong

SeaSar2之通過自動注入的方式管理Bean-yellowcong

上一個,我們介紹瞭如何通過Seasar2來實現Bean的管理呼叫,上一個是基於app.icon配置檔案做的,我這次教大家如何做自動注入的方式來管理Bean,需要配置j2ee.dicon、app.dicon兩個配置檔案,配置的操作中,我的資料庫寫得是Oracle的,所以大家如果是mysql的,需要注意一下,原始碼地址:https://git.oschina.net/yellowcong/seasar 我可能以後還會新增一些關於s2dao的類容,官網中文的http://s2container.seasar.org/2.4/zh/DIContainer.html 大家可以看一下,關於容器注入的

目錄結構

這裡寫圖片描述

SeaSar環境搭建

這個環境還是挺坑的,官方的例子都會有坑讓你跳,上一個,我們配置了通過app.dicon檔案好用,但是到了註解,它還需要匯入transaction 和ognl的jar包,而且依賴seasardao包下面是完整,而且需要配置app.dicon和j2ee.dicon兩個配置檔案,才能做自動注入的操作,一般直接複製貼上,然後改一下注入的方式和資料庫,就可以用了

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation
="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>seasar</groupId> <artifactId>demo</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>demo Maven Webapp</name
>
<url>http://maven.apache.org</url> <repositories> <repository> <id>aliyunmaven</id> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </repository> <repository> <id>seasar</id> <url>https://www.seasar.org/maven/maven2/</url> </repository> <repository> <id>ojdbc6</id> <url>http://www.datanucleus.org/downloads/maven2/</url> </repository> </repositories> <dependencies> <!-- 匯入jsp --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2.1-b03</version> <scope>provided</scope> </dependency> <!-- 匯入servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.4</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- seasar框架 的容器 BEGIN--> <dependency> <groupId>org.seasar.container</groupId> <artifactId>s2-framework</artifactId> <version>2.3.23</version> </dependency> <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance --> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/jboss/javassist --> <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.21.0-GA</version> </dependency> <!-- https://mvnrepository.com/artifact/ognl/ognl --> <dependency> <groupId>ognl</groupId> <artifactId>ognl</artifactId> <version>2.6.9-patch-20070624</version> </dependency> <!-- Jta需要加入,不然就會報java.lang.NoClassDefFoundError: javax/transaction/TransactionManager --> <dependency> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> <version>1.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <!-- seasar框架 的容器 END--> <!--seasar框架 Dao--> <!-- 不同版本的s2-dao依賴的s2-framework不一樣 --> <dependency> <groupId>org.seasar.dao</groupId> <artifactId>s2-dao</artifactId> <version>1.0.50</version> </dependency> <!-- https://mvnrepository.com/artifact/org.seasar.container/s2-extension --> <dependency> <groupId>org.seasar.container</groupId> <artifactId>s2-extension</artifactId> <version>2.3.23</version> </dependency> <!-- https://mvnrepository.com/artifact/oracle/ojdbc6 --> <dependency> <groupId>oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency> </dependencies> <build> <finalName>demo</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> <configuration> <!-- 配置war包的名稱 --> <warName>hello</warName> </configuration> </plugin> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.6.v20170531</version> <configuration> <scanIntervalSecond>10</scanIntervalSecond> <webApp> <contextPath>/users</contextPath> </webApp> <connectors> <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector"> <port>8080</port> <maxIdleTime>60000</maxIdleTime> </connector> </connectors> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>

app.dicon

app.icon配置中,我們必須匯入dao.dicon的配置,才可以做自動注入的操作,這個dao.dicon在s2-dao-1.0.50.jar包下面預設配置的

這裡寫圖片描述

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components >
    <!--dao.dicon  我們必須配置這個dao.dicon,而且還必須有j2ee這個dao檔案,這個是s2-dao-1.0.50.jar包下面預設配置的,我草,真尼瑪是坑啊-->
    <include path="dao.dicon"/>

    <!-- ==================================================================== -->
    <!-- Component Auto Register                                              -->
    <!-- ==================================================================== -->

  <!-- Component Auto Register -->
  <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
    <!-- DAO -->
    <initMethod name="addClassPattern" >
      <arg>"com.yellowcong.dao"</arg>
      <arg>".*DaoImpl"</arg>
    </initMethod>

    <!-- Business Logic -->
     <initMethod name="addClassPattern" >
      <arg>"com.yellowcong.service"</arg>
      <arg>".*Impl"</arg>
    </initMethod>


  </component>
</components>

dao.dicon中的配置,這個是預設配置,我們不需要做任何的操作,但是你會看到j2ee.dicon,你就會明白,還必須得配置這個檔案,這個檔案沒有預設的,是我們自己建,

這裡寫圖片描述

j2ee.dicon

dao.dicon中寫了,需要依賴於這個配置檔案,所以如果需要寫注入,配置的操作中,我的資料庫寫得是Oracle的,所以大家如果是mysql的,需要注意一下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components namespace="j2ee">

    <component name="transactionManager"
        class="org.seasar.extension.jta.TransactionManagerImpl"/>
    <component name="requiredTx"
        class="org.seasar.extension.tx.RequiredInterceptor"/>
    <component name="requiresNewTx"
        class="org.seasar.extension.tx.RequiresNewInterceptor"/>
    <component name="mandatoryTx"
        class="org.seasar.extension.tx.MandatoryInterceptor"/>
    <component name="notSupportedTx"
        class="org.seasar.extension.tx.NotSupportedInterceptor"/>

    <component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/>
    <component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/>
    <component name="xaDataSource"
        class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
        <property name="driverClassName">
            "oracle.jdbc.OracleDriver"
        </property>
        <!--    資料庫配置-->
        <property name="URL">"jdbc:oracle:thin:@10.0.7.170:1522:ORCL5"</property><property name="user">"SOFINAM_HENSEI"</property><property name="password">"SOFINAM_HENSEI"</property>

    </component>

    <component name="connectionPool"
        class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl">
        <property name="timeout">600</property>
        <property name="maxPoolSize">10</property>
        <property name="allowLocalTx">true</property>
        <destroyMethod name="close"/>
    </component>
    <component name="dataSource"
        class="org.seasar.extension.dbcp.impl.DataSourceImpl"/>
</components>

自動注入案例

我這個案例是,通過Seasar2來注入UserDao和UserService的操作,我在上面app.dicon配置檔案中配置了注入的方式,在下個部落格中,我會詳細講這些注入方式的

UserDao

package com.yellowcong.dao;
/**
*
*作者:yellowcong
*日期:2017/08/29
*時間:16:16:38
*描述:使用者操作的Dao
*/
public interface UserDao {

    /**
     * 獲取使用者名稱稱
     * @param username
     * @return
     */
    String getUserName(String username);
}

UserDaoImpl

package com.yellowcong.dao.impl;

import com.yellowcong.dao.UserDao;

package com.yellowcong.dao.impl;

import com.yellowcong.dao.UserDao;

/**
*
*作者:yellowcong
*日期:2017/08/29
*時間:16:17:32
*描述:
*/
public class UserDaoImpl implements UserDao{

    @Override
    public String getUserName(String username) {
        return "dao——>"+username;
    }

}

UserService

package com.yellowcong.service;

/**
*
*作者:yellowcong
*日期:2017/08/29
*時間:16:48:46
*描述:
*/               
public interface UserService {

    /**
     * 獲取使用者名稱稱
     * @param username
     * @return
     */
    String getUserName(String username);
}

UserServiceImpl

package com.yellowcong.service.impl;

import com.yellowcong.dao.UserDao;
import com.yellowcong.service.UserService;

/**
*
*作者:yellowcong
*日期:2017/08/29
*時間:16:49:32
*描述:
*/
public class UserServiceImpl implements UserService{

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public String getUserName(String username) {
        return "serviceDao——>"+ this.userDao.getUserName(username);
    }
}

測試

基於配置檔案測試類

這個測試方法是通過程式碼獲取到容器,然後獲取容器中UserService的元件,再呼叫他的方法

package com.yellowcong.test;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.S2ContainerFactory;

import com.yellowcong.dao.UserDao;
import com.yellowcong.service.UserService;

/**
 *
 * 作者:yellowcong 日期:2017/08/29 time:15:58:24 描述:
 */
public class Demo {

    //配置檔案的位置
    private static final String APP_PATH = "app.dicon";

    public static void main(String[] args) {
        //獲取到容器物件
        S2Container container = S2ContainerFactory.create(APP_PATH);

        //容器初始化
        container.init();

        UserService userService = (UserService) container.getComponent(UserService.class);

        String str = userService.getUserName("yellowcong");

        System.out.println(str);
    }
}

基於S2DaoTestCase測試

seasar2提供了一個測試類,這個測試類是S2DaoTestCase ,測試方法繼承它,然後注入我們需要呼叫的類,然後在setUp中,配置我們的配置檔案路徑,然後就可以想Spring的junit測試方法一樣操作了,不需要複雜的自己例項化容器了

package com.yellowcong.test;

import org.junit.Test;
import org.seasar.dao.unit.S2DaoTestCase;

import com.yellowcong.service.UserService;

/**
*
*作者:yellowcong
*日期:2017/08/30
*時間:8:51:02
*描述:
*/
public class Demo2 extends S2DaoTestCase{

    private UserService userService ;

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    protected void setUp() throws Exception {
            super.setUp();
            include("app.dicon");
    }

    @Test
    public void test() {
        String str = userService.getUserName("junit test");
        System.out.println(str);
    }
}

測試結果

測試結果成功,我們的包自動注入到了Bean中

這裡寫圖片描述