Spring Framework
Spis treści
AOP
Szkielet
Na początek stworzymy projekt Eclipsowy za pomocą Mavena 2.:
Logi
Najpierw zadbamy o ładne i zgrabne logi:
-
W
resources
tworzymy plik log4j.properties
log4j.debug=true
log4j.logger.org.springframework=WARN, jwt
log4j.logger.jwt=DEBUG, jwt
log4j.appender.jwt=org.apache.log4j.ConsoleAppender
log4j.appender.jwt.layout=org.apache.log4j.PatternLayout
log4j.appender.jwt.layout.ConversionPattern=%d{HH:mm:ss} %5p %c{2} (%M line %L): %m%n
Aspekty i beany
- Tworzymy pakiet
jwt.spring.aop.aspects
- W nim tworzymy klasę
AspectClass.java
package jwt.spring.aop.aspects;
import org.apache.log4j.Logger;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class AspectClass {
private static final Logger logger = Logger.getLogger(AspectClass.class);
@Pointcut("within(jwt.spring.aop.dao..*)")
public void daoPointcut() {}
@Before("daoPointcut()")
public void daoRun() {
logger.info("dao run");
}
@After("daoPointcut()")
public void daoExit() {
logger.info("dao exit");
}
@AfterThrowing(pointcut="daoPointcut()", throwing="ex")
public void daoExitExc(Exception ex) {
logger.error("dao throws exception: ", ex);
}
}
- Tworzymy pakiet
jwt.spring.aop.dao
- W nim tworzymy interfejs
StudentDao.java
package jwt.spring.aop.dao;
import java.util.List;
public interface StudentDao {
public List<String> getAllIndex();
public boolean isIndex(String index) throws Exception;
}
- Tworzymy pakiet
jwt.spring.aop.dao.impl
- W nim tworzymy klasę
MockStudentDaoImpl.java
package jwt.spring.aop.dao.impl;
import java.util.List;
import jwt.spring.aop.dao.StudentDao;
public class MockStudentDaoImpl implements StudentDao {
public List<String> getAllIndex() {
return null;
}
public boolean isIndex(String index) throws Exception {
return index.length() == 6;
}
}
Konfiguracja beanów
Testujemy
Ćwiczenia
Wariacje na temat beanów
Szkielet
Na początek stworzymy projekt Eclipsowy za pomocą Mavena 2.:
Logi
-
W
resources
tworzymy plik log4j.properties
log4j.debug=true
log4j.logger.org.springframework=WARN, jwt
log4j.logger.jwt=DEBUG, jwt
log4j.appender.jwt=org.apache.log4j.ConsoleAppender
log4j.appender.jwt.layout=org.apache.log4j.PatternLayout
log4j.appender.jwt.layout.ConversionPattern=%d{HH:mm:ss} %5p %c{2} (%M line %L): %m%n
Beany
- Tworzymy pakiet
jwt.spring.common.beans
-
W nim tworzymy klasę
ConfigSetter.java
package jwt.spring.common.beans;
public class ConfigSetter {
private Integer port;
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
}
-
W tym samym pakiecie tworzymy klasę
ConfigCon.java
package jwt.spring.common.beans;
public class ConfigCon {
private Integer port;
private String address;
public String getAddress() {
return address;
}
public Integer getPort() {
return port;
}
public ConfigCon(Integer port, String address) {
this.port = port;
this.address = address;
}
}
-
W tym samym pakiecie tworzymy klasę
MainBean.java
. Będziemy do niej injectowali
beany za pomocą settera i konstruktora.
package jwt.spring.common.beans;
import org.apache.log4j.Logger;
public class MainBean {
private static final Logger logger = Logger.getLogger(MainBean.class);
private ConfigSetter configSetter;
public ConfigSetter getConfigSetter() {
return configSetter;
}
public void setConfigSetter(ConfigSetter configSetter) {
this.configSetter = configSetter;
}
private ConfigCon configCon2;
public void show() {
logger.info(configSetter.getAddress() + ":" + configSetter.getPort());
logger.info(configCon2.getAddress() + ":" + configCon2.getPort());
}
public MainBean(ConfigCon configCon) {
configCon2 = configCon;
}
}
-
W tym samym pakiecie tworzymy klasę
MainBeanByName.java
. Będziemy do niej injectowali
beany z autoWire równym byName.
package jwt.spring.common.beans;
import org.apache.log4j.Logger;
public class MainBeanByName {
private static final Logger logger = Logger.getLogger(MainBeanByName.class);
private ConfigCon configCon;
public ConfigCon getConfigCon() {
return configCon;
}
public void setConfigCon(ConfigCon configCon) {
this.configCon = configCon;
}
public void show() {
logger.info(configCon.getAddress() + ":" + configCon.getPort());
}
}
-
W tym samym pakiecie tworzymy klasę
MainBeanByCon.java
. Będziemy do niej injectowali
beany z autoWire równym constructor.
package jwt.spring.common.beans;
import org.apache.log4j.Logger;
public class MainBeanByCon {
private static final Logger logger = Logger.getLogger(MainBeanByCon.class);
private ConfigCon configCon;
public void show() {
logger.info(configCon.getAddress() + ":" + configCon.getPort());
}
public MainBeanByCon(ConfigCon configCon) {
this.configCon = configCon;
}
}
-
W tym samym pakiecie tworzymy klasę
MainBeanByType.java
. Będziemy do niej injectowali
beany z autoWire równym byType.
package jwt.spring.common.beans;
import org.apache.log4j.Logger;
public class MainBeanByType {
private static final Logger logger = Logger.getLogger(MainBeanByType.class);
private ConfigCon c;
public ConfigCon getConfigCon() {
return c;
}
public void setConfigCon(ConfigCon configCon) {
this.c = configCon;
}
public void show() {
logger.info(c.getAddress() + ":" + c.getPort());
}
}
Konfiguracja beanów
Testujemy
Ćwiczenia
- Przetestuj injectowanie kolekcji
- Przetestuj mergowanie kolekcji
- Przetestuj autowire default
Spring + JPA
Szkielet
Na początek stworzymy projekt Eclipsowy za pomocą Mavena 2.:
Logi
Najpierw zadbamy o ładne i zgrabne logi:
-
W
resources
tworzymy plik log4j.properties
log4j.debug=true
log4j.logger.org.springframework=WARN, jwt
log4j.logger.org.hibernate=WARN, jwt
log4j.logger.jwt=DEBUG, jwt
log4j.appender.jwt=org.apache.log4j.ConsoleAppender
log4j.appender.jwt.layout=org.apache.log4j.PatternLayout
log4j.appender.jwt.layout.ConversionPattern=%d{HH:mm:ss} %5p %c{2} (%M line %L): %m%n
Entity
Teraz czas na stworzenie Entity Beana w sensie JPA:
- Tworzymy pakiet
jwt.spring.jpa.entity
w głównych źródłach programu
-
W nim tworzymy klasę
Student
package jwt.spring.jpa.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Student {
@Id
@GeneratedValue
int id;
private String firstName;
private String lastName;
private Integer index;
@Override
public String toString() {
return firstName + " " + lastName + " (" + index + ")";
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public Integer getIndex() {
return index;
}
public void setIndex(Integer index) {
this.index = index;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
- W
resources
tworzymy katalog META-INF
i tworzymy plik persistence.xml
<persistence>
<persistence-unit name="examplePersistenceUnit"
transaction-type="RESOURCE_LOCAL">
<class>jwt.spring.jpa.entity.Student</class>
<properties>
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="hibernate.connection.driver_class"
value="org.hsqldb.jdbcDriver" />
<property name="hibernate.connection.url"
value="jdbc:hsqldb:mem:mem:aname" />
<property name="hibernate.connection.username" value="sa" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.HSQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
DAO
Tworzymy DAO z wykorzystaniem JPA:
- Tworzymy pakiety
jwt.spring.jpa.dao
i jwt.spring.jpa.dao.impl
-
Tworzymy interfejs
StudentService
w jwt.spring.jpa.dao
package jwt.spring.jpa.dao;
import java.util.List;
import jwt.spring.jpa.entity.Student;
public interface StudentService {
public Student save(Student student);
public void delete(Student student);
public List<Student> getByIndex(Integer index);
}
-
Tworzymy implementacje
StudentServiceImpl
w jwt.spring.jpa.dao.impl
package jwt.spring.jpa.dao.impl;
import java.util.List;
import jwt.spring.jpa.dao.StudentService;
import jwt.spring.jpa.entity.Student;
import org.apache.log4j.Logger;
import org.springframework.orm.jpa.support.JpaDaoSupport;
public class StudentServiceImpl extends JpaDaoSupport implements StudentService {
private static final Logger logger = Logger.getLogger(StudentServiceImpl.class);
public void delete(Student student) {
if (logger.isDebugEnabled()) {
logger.debug("remove student: " + student.toString());
}
getJpaTemplate().remove(student);
}
@SuppressWarnings("unchecked")
public List<Student> getByIndex(Integer index) {
if (logger.isDebugEnabled()) {
logger.debug("find student, index: " + index);
}
return getJpaTemplate().find("select s from Student s where s.index=?1", index);
}
public Student save(Student student) {
if (logger.isDebugEnabled()) {
logger.debug("save student: " + student.toString());
}
getJpaTemplate().persist(student);
return student;
}
}
Konfiguracja beanów
Czas na esencje całości czyli konfiguracja beanów
Testujemy
-
W testach tworzymy
TestDAO
package jwt.spring.jpa;
import java.util.List;
import jwt.spring.jpa.dao.impl.StudentServiceImpl;
import jwt.spring.jpa.entity.Student;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.test.jpa.AbstractJpaTests;
import org.springframework.transaction.annotation.Transactional;
@Transactional(readOnly=false)
public class TestDAO extends AbstractJpaTests {
@Test
public void testQuery() throws Exception {
Student student = new Student();
student.setFirstName("Krzysztof");
student.setLastName("Slusarski");
student.setIndex(209502);
studentServiceDAO.save(student);
List<Student> list = studentServiceDAO.getByIndex(209502);
assertEquals(list.size(), 1);
studentServiceDAO.delete(student);
list = studentServiceDAO.getByIndex(209502);
assertEquals(list.size(), 0);
}
@Before
public void launchSetup() throws Exception {
setUp();
}
@After
public void launchTearDown() throws Exception {
tearDown();
}
protected String[] getConfigLocations() {
return new String[] { "beans.xml" };
}
private StudentServiceImpl studentServiceDAO;
public void setStudentServiceDAO(StudentServiceImpl studentServiceDAO) {
this.studentServiceDAO = studentServiceDAO;
}
}
-
Uruchamiamy
mvn test
Linki
Autor
Krzysztof Ślusarski;