Spring java configuration

26
Spring Java configurati on Jakub Kohout, June 2013

Transcript of Spring java configuration

Page 1: Spring java configuration

Spring Java configuration Jakub Kohout, June 2013

Page 2: Spring java configuration

Osnova Konfigurace Springu

Bean lifecycle Typy konfigurace

XML Anotace Java code

Ukázka Shrnutí

Spring Java configuration

Page 3: Spring java configuration

Konfigurace Springu

Spring Java configuration

Page 4: Spring java configuration

Konfigurace Springu Poskytuje rozsáhlou infrastrukturu pro vývoj Java enterprise

aplikací

Spring != spring framework >> Spring == spring-*

spring framework spring-security spring-integration spring-batch spring-data-* spring-roo spring-social spring-mobile spring-ws spring-amqp …

Vývojář se stará jen o business logiku

Spring Java configuration

Page 5: Spring java configuration

Bean lifecycle

Spring Java configuration

Page 6: Spring java configuration

Bean lifecycle

Spring Java configuration

FactoryBeanBean

definitions

BeanFactoryPostProcesso

rs

Instantiation

Dependency Injection

BeanPostProcessors

Application ready to use

Spring container

POJO + 3rd. party libraries

Page 7: Spring java configuration

Typy konfigurace -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://">

<bean class=“cz.test.project.service.PrintService" id="printService"> <property name=“…" value=“…"/>

</bean></beans>

Spring Java configuration

FactoryBeanXML Bean definitions

Page 8: Spring java configuration

Typy konfigurace -XMLVýhody

Jednoduchost Konzistentní způsob konfigurace Fail fast konfigurace Flexibilita - široké možnosti konfigurace bean

<bean id="printService" class="cz.test.project.PrintService" init-method="initIt" destroy-method="cleanUp">   <property name="..." value="…" /> </bean>

Podpora modularity<import resource="data-access.xml" />

Spring Java configuration

Page 9: Spring java configuration

Typy konfigurace -XMLNevýhody

Verbose (ukecanost) Není type safe Potřeba speciálního editoru Nelze volat jiné metody než setry,

konstruktory Někdo prostě nemá rád XML

Spring Java configuration

Page 10: Spring java configuration

Typy konfigurace -XMLXML namespaces<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:jpa="http://www.springframework.org/schema/data/jpa"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task=http://www.springframework.org/schema/task …

<context:property-placeholder location="classpath*:META-INF/spring/*.properties,classpath*:*.properties“>

<context:spring-configured /><aop:aspectj-autoproxy /><task:annotation-driven />

<tx:annotation-driven transaction-manager="transactionManager" />

Spring Java configuration

Page 11: Spring java configuration

Typy konfigurace –XML + @

od Spring 2.5 JSR 250 (@PreDestroy, @PostConstruct …)

<context:annotationConfig />

@Autowired, @Component <context:component-scan base-package="cz.test.project.service" />

@Repositorypublic class PrintRepository {

…}

@Servicepublic class PrintServiceImpl implements PrintService {

@Autowiredprivate PrintRepository printRepository;

public void savePrint(Print print) {printRepository.save(print);

}}

Spring Java configuration

FactoryBeanXML Bean

+Annotations

Page 12: Spring java configuration

Typy konfigurace –XML + @

Výhody Odstraňuje spoustu bean definic v XML V případě změny bean není nutné měnit XML

definice

Spring Java configuration

Page 13: Spring java configuration

Typy konfigurace –XML + @

Nevýhody Nelze použít pro konfiguraci komponent třetích

stran K zapnutí podpory anotací je potřeba definice v

XML Ztráta přehledu o definovaných beanách

Správně definování component-scannu Může dojít k dvojznačnostem

Lze použít @Qualifier Component scan je časově náročnější

Spring Java configuration

Page 14: Spring java configuration

Typy konfigurace – Java code + @

od Spring 3.0 Nahrazuje veškerou konfiguraci v XML !

@Configuration

public class RootApplicationContext {

@Bean

public PrintService printService() {

return new PrintServiceImpl();

}

}

Spring Java configuration

FactoryBean@Bean

methods

Page 15: Spring java configuration

Typy konfigurace – Java code + @

@Configuration

@ComponentScan(basePackages = { "cz.test.project.service" })

@Import(DatabaseConfiguration.class)

public class RootApplicationContext {

}

Detekce @Configuration Předáním konstruktoru ApplicationContext Metoda register() Component-scan

Potřeba CGLib knihovny Beany defaultně singleton Beany musí mít defaultní konstruktor

Spring Java configuration

Page 16: Spring java configuration

Typy konfigurace – Java code + @

Použití konstruktoru, nebo metody register()

public static void main(final String[] args) {final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(RootApplicationContext.class);context.register(DatabaseConfiguration.class);context.refresh();

final PrintService printService = context.getBean(PrintService.class);printService.sayHello();

}

Spring Java configuration

Page 17: Spring java configuration

Typy konfigurace – Java code + @

Použití component scanu

public static void main(final String[] args) {final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.scan("cz.test.project.config");context.refresh();

final PrintService printService = context.getBean(PrintService.class);printService.sayHello();

}

Spring Java configuration

Page 18: Spring java configuration

Typy konfigurace – Java code + @

Spring Java configuration

Konfigurace JPA

@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory() {

final LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();entityManagerFactory.setDataSource(dataSource());entityManagerFactory.setPersistenceXmlLocation("classpath:META-INF/persistence.xml");

return entityManagerFactory;}

Page 19: Spring java configuration

Typy konfigurace – Java code + @

Spring Java configuration

Konfigurace JPA bez persistence.xml

@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactory() {

final LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();

entityManagerFactory.setDataSource(dataSource());entityManagerFactory.setPackagesToScan("cz.test.project.domain");entityManagerFactory.setPersistenceProviderClass(HibernatePersistence.class);

entityManagerFactory.setJpaProperties(new Properties() { private static final long serialVersionUID = 1L;

{setProperty("hibernate.hbm2ddl.auto", "update");setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");};

});

return entityManagerFactory;}

Page 20: Spring java configuration

Typy konfigurace – Java code + @

Spring Java configuration

Konfigurace webové aplikace

@Configuration@ComponentScan(basePackages = { "cz.test.project.web" })@EnableWebMvcpublic class WebApplicationContext extends WebMvcConfigurerAdapter {

@Beanpublic InternalResourceViewResolver viewResolver() {

final InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;

}

}

@EnableWebMvc nahrazuje <mvc:annotation-driven />

Page 21: Spring java configuration

Typy konfigurace – Java code + @

Spring Java configuration

WebMvcConfigurerAdapter

@Overridepublic void addFormatters(FormatterRegistry registry) {

// TODO Auto-generated method stubsuper.addFormatters(registry);

}

@Overridepublic void addInterceptors(InterceptorRegistry registry) {

// TODO Auto-generated method stubsuper.addInterceptors(registry);

}

@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

// TODO Auto-generated method stubsuper.configureMessageConverters(converters);

}

Page 22: Spring java configuration

Typy konfigurace – Java code + @

Spring Java configuration

Konfigurace webové aplikace bez web.xml ! WebApplicationInitializer – konfigrace servlet contextu

Pouze v Servlet 3.0+ V dependencies musí být spring-web knihovny

public class WebAppInitilizer implements WebApplicationInitializer {

public void onStartup(final ServletContext context) throws ServletException {final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();rootContext.register(RootApplicationContext.class);

context.addListener(new ContextLoaderListener(rootContext));

final AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();webContext.register(WebApplicationContext.class);

final ServletRegistration.Dynamic dispatcher = context.addServlet("java-configuration", new DispatcherServlet(webContext));

dispatcher.setLoadOnStartup(1);dispatcher.addMapping("/");

}}

Page 23: Spring java configuration

Typy konfigurace – Java code + @

Spring Java configuration

Konfigurace spring-data @EnableJpaRepositories(basePackages =

{ "cz.test.project.repository" }) <jpa:repositories base-package="cz.test.project.repository" />

Konfigurace transakcí @EnableTransactionManagement <tx:annotation-driven transaction-manager="transactionManager" />

Konfigurace schedulerů @EnableScheduling <task:annotation-driven />

Konfigurace aspektů @EnableAspectJAutoProxy <aop:aspectj-autoproxy />

Konfigurace cache @EnableCaching

Page 24: Spring java configuration

Typy konfigurace – Java code + @

Spring Java configuration

Výhody Ke konfiguraci lze použít jakékoliv metody (ne jen

modifikátory a konstruktory) Větší kontrola nad konfigurovanými objekty Více type safe Konzistentní způsob konfigurace Není potřeba XML

Page 25: Spring java configuration

Shrnutí

Spring Java configuration

XML Definice infrastrukturních bean (neměnících se)

Datasource transaction manager, …+ Cetralizovaná konfigurace+ Jednoduché, známé– Omezené možnosti

Anotace Vhodné pro často se měnící beany

service, controller, dao / repository+ Editace pouze na jednom místě+ Rychlý vývoj– Možnost „oanotovat“ pouze vlastní třídy

Java konfigurace Kompletní kontrola vytváření instancí a konfigurace+ Konfigurace není míchána s ostatním kódem+ Vhodné pro Legacy code

Page 26: Spring java configuration

Otázky?

Spring Java configuration