Top Banner
Introduction to Spring (part 2) Matt Wheeler
45

Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Dec 29, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Introduction to Spring (part 2)Matt Wheeler

Page 2: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Notes

• This is a training NOT a presentation• Please ask questions• Prerequisites

– Introduction to Java Stack– Basic Java and XML skills– Introduction to Spring (part 1)– Installed LdsTech IDE (or other equivalent)

Page 3: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Review

• Last time we went over– Bean definitions– Dependency Injection (DI) and Inversion of Control

(IoC)– Application context– Bean scopes

Page 4: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Review

<?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.0.xsd">

<bean class="org.lds.training.SomeBean" /></beans>

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");SomeBean someBean = context.getBean(SomeBean.class);someBean.callMethod();

• Bean definition (beans.xml)

• Application Context

Page 5: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Overview

• Bean lifecycle• XML Schema-based configuration (namespace

handlers)• Lifecycle hooks

• Bean Initialization (JSR 250, @PostConstruct, …)• Bean post processors

• Component scanning• Spring Component Annotations• DI Annotations (JSR 330, @Inject, @Named)

Page 6: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Spring Bean Lifecycle

1. Bean definitions created/registered (from xml or annotations, or, …)

2. Beans instantiated using the definitions3. Dependencies set (values and bean references)

on the newly instantiated beans4. Bean initialization5. Beans delivered to requester for use6. Destruction callback method called at container

shutdown

Page 7: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

XML Schema-based configuration

• Also called namespace handlers• Shorten bean definition configuration• Provide easily reusable definitions• Self documenting• More readable

• NOTE: Takes place in the first phase of the bean lifecycle (i.e. while xml files are being parsed)

Page 8: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

XML Schema-based configuration

• Example namespace handler

• Basically equivalent configuration

<mvc:annotation-driven validator="validator" />

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="order" value="0"/> <property name="useDefaultSuffixPattern" value="false"></property></bean>

<bean class="org.springframework.web.servlet.handler.MappedInterceptor"> <constructor-arg value="null"></constructor-arg> <constructor-arg> <bean class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor"> <constructor-arg> <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean"></bean> </constructor-arg> </bean> </constructor-arg></bean>

Page 9: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Wait that’s not all

And this<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer"> <bean id="webBindingInitializer" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="validator" ref="validator" /> <property name="conversionService"> <bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> </property> </bean> </property> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="writeAcceptCharset" value="false" /> </bean> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> </list> </property></bean>

Page 10: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Another Example

• Utilizing a namespace handler<?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">

  <!-- creates a java.util.Set instance with the supplied values --> <util:set id="alphaGroups"> <value>abc</value> <value>def</value> <value>ghi</value> <value>jkl</value> </util:set></beans>

<bean id="alphaGroups" class="org.springframework.beans.factory.config.SetFactoryBean"> <property name="sourceSet"> <set> <value>abc</value> <value>def</value> <value>ghi</value> <value>jkl</value> </set> </property></bean>

Page 11: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Demo

DEMO

Page 12: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Spring XML Schema-based configurations

Schema Description / Documentation

util Create non-anonymous collection types that can be referenced by idhttp://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html#xsd-config-body-schemas-util

jee Elements such as jndi support / ejb shortcutshttp://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html#xsd-config-body-schemas-jee

lang Expose beans written in another language like JRuby or Groovyhttp://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html#xsd-config-body-schemas-lang

jms Deal with configuring JMS-related beanshttp://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html# xsd-config-body-schemas-jms

tx Transaction supporthttp://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html# xsd-config-body-schemas-tx

Page 13: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

XML Schema-based configuration (cont.)

Schema Description / Documentation

aop Helpers for Spring’s aspect oriented programming mechanismshttp://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html# xsd-config-body-schemas-aop

context Configuration related to the application context plumbing http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html# xsd-config-body-schemas-context

tools Configuration for adding tooling specific meta-datahttp://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/xsd-config.html# xsd-config-body-schemas-tool

security Provides elements for web security configurationhttp://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html

mvc Provides interceptors, view-controller, …..http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-config

Page 14: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

XML Schema-based configuration arch.

• Parts of XML Schema-based configuration– Xml schema that describes allowable elements– Namespace handler (Java code)– BeanDefinitionParser (Java code)

• Parses the defined xml and adds any necessary beans into the configuration

• Bottom line– Namespace handlers are backed by code

• The code supplements bean configuration and is often a lot more than meets the eye

Page 15: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Bean Definition Parsers

• Let’s look at an example<abc:something some-attribute=“true” />

public class SomeBeanDefinitionParser implements BeanDefinitionParser {

public AbstractBeanDefinition parse(Element element, ParserContext parserContext) {

CompositeComponentDefinition compositeDef = new CompositeComponentDefinition(element.getTagName(), parserContext.extractSource(element)); parserContext.pushContainingComponent(compositeDef);

BeanDefinitionBuilder someBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(SomeBean.class); if (Boolean.parseBoolean(element.getAttribute("some-attribute"))) {

SomeBeanDefinition.addPropertyValue("someProperty", "abc"); }…

Page 16: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Lab 1: XML Schema-based configuration

https://tech.lds.org/wiki/Introduction_to_Spring_Continued#Lab_1_Xml_

Schema-based_configuration

Page 17: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Bean Initialization (JSR 250)

Page 18: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Spring Bean Lifecycle

1. Bean definitions created/registered (from xml or annotations, or, …)

2. Beans instantiated using the definitions3. Dependencies set (values and bean references)

on the newly instantiated beans4. Bean initialization5. Beans delivered to requester for use6. Destruction callback method called at container

shutdown

Page 19: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Hooking into the Lifecycle

• Assume the following class

• Define init-method to be called

• The init method is called after the bean has been initialized and all properties set

<bean id="whatever" init-method="init" class="org.lds.training.SomeBean" />

public class SomeBean { public void init() { //some initialization code }}

Page 20: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

JSR 250 Common Annotations

• The goal of JSR 250 was to come up with a standard set of annotations to accomplish common use cases in Java

• The annotations are outlined here: http://en.wikipedia.org/wiki/JSR_250

• We will only be focusing on a tiny subset of these annotations in order to replace our init-method functionality

Page 21: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Annotate the Class

• JSR 250 annotations provides @PostConstruct annotation for bean initialization

• There is likewise an @PreDestroy counterpart– Called just before the bean is destroyed– Allows for cleanup of resources

public class SomeBean { @PostConstruct public void init() { // do some initialization work }}

Page 22: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Configure Annotation Handling

• Specify annotation handlers (bean post processors)

<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.0.xsd">

<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" /></beans>

<!– or -->

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance

xmlns:context=http://www.springframework.org/schema/contextxsi: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:annotation-config /></beans>

Page 23: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Lab 2: JSR 250 Annotations

https://tech.lds.org/wiki/Introduction_to_Spring_Continued#Lab_2_JSR_2

50_Annotations

Page 24: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Spring Component Annotations

• We have seen how to use annotations to call an init method during initialization

• Wouldn’t it be nice if didn’t need to define even the beans themselves in xml at all?– We will need something to scan the classes for

annotations and register bean definitions

Page 25: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Welcome component-scan

• component-scan element in context schema– Scans classpath searching for matching beans

• Registers bean definitions for matching classes

– Can specify an include filter and/or exclude filter• You can also assign a filter type for a targeted search

– http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-scanning-filters

– annotation– assignable– regex– custom

Page 26: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Bean Lifecycle and Component Scan

1. Create bean definitions (from xml or annotations, or, …)

2. Instantiate beans using the definitions3. Set bean dependencies (values and bean

references) on the newly instantiated beans4. Initialization5. Deliver bean to requester for use6. On container shutdown call destruction callback

method

Page 27: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

For Example

• This configuration will (for the given packages):– Register bean definitions for all classes with “abc” in

their names– Not register beans for any classes that extend /

implement Animal<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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="org.lds.training,org.lds.another"> <context:include-filter expression="org\.lds\.training\..*abc.*" type="regex"/> <context:exclude-filter expression=“org.lds.training.Animal" type="assignable"/></context:component-scan>

</beans>

Page 28: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Naming

• What id will be given for beans that are registered?

• By default it is the class name with the first letter lower cased– For example, a class named Rabbit would result in a

bean definition with id=“rabbit”– Package is dropped from the name

Page 29: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Annotation Scanning

• What do we do if:– The default naming is not acceptable– Difficult to come up with a pattern that matches only

the beans that we want registered with Spring– What if we don’t want scope of singleton

• We can employ annotations and only register definitions for classes that are appropriately annotated

Page 30: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Spring Component Annotations

• Spring provides stereotype annotations to identify a bean’s role in the app. architecture– @Service – denotes application services– @Controller – denotes view layer components– @Component – the most general stereotype

annotation – denotes any class to be managed by Spring

– @Repositoy – most often used to demarcate DAOs– You can also create your own custom stereotype

annotations

Page 31: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

For Example

• In a given application context you may want to have the scanner selectively register definitions

– Register beans annotated with your custom annotation– Once include is specified defaults are disabled

<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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="org.lds.training"> <context:include-filter expression="org.lds.training.Custom" type="annotation"/> <context:include-filter expression="org.springframework.stereotype.Service type="annotation"/></context:component-scan>

</beans>

Page 32: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Naming

• So how does annotation scanning help naming?– The following will still register a bean with id=“rabbit”

– But, this will register a bean with id=“crazyRabbit”

– I.e. the annotations allow you to provide a specific name for the given bean to the bean definition parser

@Componentpublic class Rabbit {}

@Component("crazyRabbit")public class Rabbit {}

Page 33: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

The Main Point

• All this to tell you that now you can create a bean automatically without defining it in xml

• That is to say, the following are basically equivalent in function

<bean id="something" class="org.lds.training.SomeBean" />

@Component("something")public class SomeBean {}

Page 34: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Scope

• But what about scope– What is the equivalent annotation for specifying a

scope of prototype

– @Scope("prototype")

<bean id="something" class="org.lds.training.SomeBean" scope="prototype"/>

Page 35: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

@Scope

• Be sure to use org.springframework.context.annotation.Scope– Not javax.inject.Scope

• Possible values:– @Scope or @Scope("singleton")– @Scope("prototype")– @Scope("request")– @Scope("session")

Page 36: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Putting it all together

• Xml definition

• Equivalent annotation definition

<bean id="turkey" class="org.lds.training.Turkey" scope="prototype">

@Component@Scope("prototype")public class Turkey {}

Page 37: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Lab 3: Spring Component Annotations

https://tech.lds.org/wiki/Introduction_to_Spring_Continued#Lab_3_Sprin

g_Component_Annotations

Page 38: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

JSR 330 Annotations (DI)

• Now that we can create bean definitions how do we specify injection

Page 39: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Dependency

• JSR 330 annotations require you to include the following dependency:

– Don’t be alarmed by the unorthodox version value• It is correct as of this writing

<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>

Page 40: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Dependency Injection Annotations

• To inject beans we have the following new annotations– @Inject – inject bean references by type– @Named – modify injection by providing a name

Page 41: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

@Inject

• @Inject can be used almost anywhere//on a member variable@Injectprivate Rabbit rabbit;

//on a constructor@Injectpublic Farm(Rabbit prizeRabbit) {…}

//on a setter method@Injectpublic void setPrizeRabbit(Rabbit rabbit) { this.rabbit = rabbit; }

//if you can’t inject all of them by type you could use @Named to narrow to a single match@Injectpublic void anyMethod(Chicken chicken, @Named("prototypeRabbit") Rabbit rabbit, Duck duck) { … }

//on collections (will inject all beans in the application context of the specified type)@Injectprivate Rabbit[] rabbits;@Injectprivate List<Rabbit> rabbits; //will contain all beans with the given type and the bean name as the key@Injectprivate Map<String, Rabbit> rabbits;

Page 42: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

@Inject (cont)

• By default injection injects by type– Finds any registered instances of the type for the

annotated type• What if you have two targets of the same type?

– You can specify by name– Downside is that this is no longer type safe

• Only referenced by a String• Could employ a Qualifier to remain type safe• http://static.springsource.org/spring/docs/3.0.x/spring-

framework-reference/html/beans.html#beans-autowired-annotation-qualifiers

@Inject@Named("prototypeRabbit")private Rabbit prizeRabbit;

Page 43: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Putting it all together

• Xml definition

• Somewhat equivalent annotation definition

<bean id="billysFarm" class="org.lds.training.Farm"> <constructor-arg name="turkey" ref="turkey" /></bean>

@Componentpublic class Turkey { … }

@Component(" billysFarm ")public class Farm { private Turkey turkey; @Inject public Farm(Turkey turkey) { this.turkey = turkey; }}

Page 44: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Lab 4: JSR 330 (DI) Annotations

https://tech.lds.org/wiki/Introduction_to_Spring_Continued#Lab_4_JSR_3

30_Annotations

Page 45: Introduction to Spring (part 2) Matt Wheeler. Notes This is a training NOT a presentation Please ask questions Prerequisites – Introduction to Java Stack.

Credit where credit is due

• http://springsource.org• Spring Recipies 2nd Edition (Gary Mak, Josh Long

and Daniel Rubio)