Spring java configuration
-
Upload
jakub-kohout -
Category
Technology
-
view
854 -
download
1
Transcript of Spring java configuration
Spring Java configuration Jakub Kohout, June 2013
Osnova Konfigurace Springu
Bean lifecycle Typy konfigurace
XML Anotace Java code
Ukázka Shrnutí
Spring Java configuration
Konfigurace Springu
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
Bean lifecycle
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
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
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
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
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
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
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
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
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
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
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
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
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;}
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;}
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 />
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);
}
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("/");
}}
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
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
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
Otázky?
Spring Java configuration