liguofeng29’s blog

個人勉強用ブログだっす。

spring4 - @Qualifier, alias

@Qualifierは、bean名を指定してDIを行う

package spring4.second;
public interface SomeService {
    public String getMessage();
}

package spring4.second;
import org.springframework.stereotype.Component;
@Component("SomeServiceAImpl")
public class SomeServiceAImpl implements SomeService {

    @Override
    public String getMessage() {
        return "AAA";
    }
}

package spring4.second;
import org.springframework.stereotype.Component;
@Component("SomeServiceBImpl")
public class SomeServiceBImpl implements SomeService {

    @Override
    public String getMessage() {
        return "BBB";
    }
}

package spring4.second;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
public class SomeObject {

    @Autowired
    @Qualifier("SomeServiceAImpl")
    private SomeService serviceA;

    @Autowired
    @Qualifier("SomeServiceBImpl")
    private SomeService serviceB;

    public void run() {
        System.out.println(serviceA.getMessage());
        System.out.println(serviceB.getMessage());
    }
}
package spring4.second;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class App {
    public static void main(String[] args) {
        ApplicationContext context1 = new AnnotationConfigApplicationContext(App.class);
        context1.getBean(SomeObject.class).run();

    }
}

出力:
AAA
BBB

aliasを使い、Bean名にエイリアスの名前を付ける

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="spring4.second" />

    <alias name="SomeServiceAImpl" alias="SomeServiceBImpl" />
</beans>
package spring4.second;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.FileSystemXmlApplicationContext;

@Configuration
@ComponentScan
public class App {
    public static void main(String[] args) {
        ApplicationContext context2 = new FileSystemXmlApplicationContext(
                "classpath:spring4/second/applicationContext.xml");
        context2.getBean(SomeObject.class).run();
    }
}

出力:
AAA
AAA
<alias name="SomeServiceAImpl" alias="SomeServiceBImpl" />
をすることで、
@Qualifier("SomeServiceBImpl") -> @Qualifier("SomeServiceAImpl")になる

git:
https://github.com/liguofeng29/java-project/tree/master/src/main/java/spring4/second

Spring4 - BeanFactoryPostProcessor

Beanを遅延生成させる

@Component
public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        for (String beanName : beanFactory.getBeanDefinitionNames()) {
            // bean名がcomponentB以外は遅延生成に設定
            if (!"componentB".equals(beanName)) {
                beanFactory.getBeanDefinition(beanName).setLazyInit(true);
            }
        }
    }
}

git:
https://github.com/liguofeng29/java-project/tree/master/src/main/java/spring4/third/lazyInitSample

Beanのscopeを変更する

package spring4.third.modifyBeanDefine;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Component;

@Component
public class ModifyBeanDefinitionFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {

        for (String beanName : beanFactory.getBeanDefinitionNames()) {
            // componentBのscopeを変更する
            if (beanName.equals("componentB")) {
                beanFactory.getBeanDefinition(beanName).setScope("prototype");
            }
        }
    }
}

git:
https://github.com/liguofeng29/java-project/tree/master/src/main/java/spring4/third/modifyBeanDefine

groovy,geb(selenium),spockによる自動化テスト その11- Report機能

gebは検証pageに対するレポート機能(HTML,PNG)を提供している。

シナリオ

  1. リスナー定義&追加(レポートする度にprintlnが実行される)
  2. googleに移動する
  3. レポートする
  4. yahooに移動する
  5. レポートする
  6. googleに移動する
  7. レポートする
  8. yahooに移動する
  9. レポートする
import geb.Browser
import geb.report.ReportState
import geb.report.Reporter
import geb.report.ReportingListener

Browser.drive {

    // リスナ定義
    reportingListener = new ReportingListener() {
        void onReport(Reporter reporter, ReportState reportState, List<File> reportFiles) {
            reportFiles.each {
                println "[[ATTACHMENT|$it.absolutePath]]"
            }
        }
    }

    // リスナ追加
    config.reporter.addListener(reportingListener);

    go 'http://www.google.co.jp/'
    report 'google-'

    go 'http://www.yahoo.co.jp/'
    report 'yahoo-'


    /** reportGroup  **/
    reportGroup "google"
    go "http://google.com"
    report "home page"

    reportGroup "github"
    go "http://github.com"
    report "home page"


    // cleanReportGroupDir()

    sleep 30 * 1000
}
出力されるレポートファイル

f:id:liguofeng29:20170302224004p:plain