〹Spring練習ioc、aop
16693 ワード
Springトレーニング
スプリングの基礎知識を学ぶことによって、SpringはJava開発の複雑さを低減するために、以下の4つの重要な戦略をとっていることが分かりました. POJOの軽量級と最小侵入性に基づいてプログラミングする. は、注入とインターフェースに依存して松結合を実現する. は、接面および慣例に基づいて声明式プログラミングを行う. は、スライスとテンプレートによってサンプルコードを減少させる. 次はspringの練習デモをして、更にspringのiocとaopの使用方法を熟知して、springテンプレートを使う長所.
デモ説明
プロジェクトを階層化し、springのiocの特性に依存して注入するユーザによる更なる修正調査項目を構築する.そしてaop特性を使ってログ操作を追加します.データベース操作はspringのjdbcTemplateを使ってデータベース操作を簡略化します.
プロジェクト構造
mavenプロジェクトを作成し、次のフォルダを構築します.
pom.xmlは以下の通りです
イベント層
entity層はUser.javeエンティティ類を含み、POJO類であり、属性、コンストラクタとsetterのみを含み、getter方法である.
以下のとおりです
DAO層は主にデータの持続層の仕事をしています.データベースと連絡するいくつかのタスクはここにカプセル化されています.DAO層の設計はまずDAOのインターフェースを設計して、Springの配置ファイルの中でこのインターフェースの実現類を定義して、モジュールの中でこのインターフェースを呼び出してデータ業務の処理を行うことができます.構造が非常に明確であり、DAO層のデータソース構成及びデータベース接続に関するパラメータはSpringのプロファイルに配置されている.
インターフェースと実装を含む.
UserDao.java
Service層は主に業務モジュールの論理応用設計を担当しています.同様に、まずインターフェースを設計し、その実現されたクラスを設計し、次にSpringの配置ファイルにその実現された関連を配置する.このように、私たちはサービスインターフェースをアプリケーションに呼び出して、業務処理を行うことができます.Service層の業務実現は、定義されたDAO層のインターフェースを具体的に呼び出し、Service層を実装するトラヒックロジックは、汎用的なトラヒックロジックの独立性と重複利用性に寄与し、プログラムは非常に簡潔である.
UserService.java
ログカットを実現
Log.java
本プロジェクトはJavaプロファイルを使用しています.ここはJavaプロファイルです.
DataConfig.java
UserServiceTest
db.properties
spring-demo
スプリングの基礎知識を学ぶことによって、SpringはJava開発の複雑さを低減するために、以下の4つの重要な戦略をとっていることが分かりました.
デモ説明
プロジェクトを階層化し、springのiocの特性に依存して注入するユーザによる更なる修正調査項目を構築する.そしてaop特性を使ってログ操作を追加します.データベース操作はspringのjdbcTemplateを使ってデータベース操作を簡略化します.
プロジェクト構造
mavenプロジェクトを作成し、次のフォルダを構築します.
--springdemo
--src
--main
--java
--aop
--conf
--dao
--service
--entity
--resources
--test
--java
--service
pom.xml
使用した依存はスプリング、slaf 4 j、log 4 j、mysql-connectorなどがあります.pom.xmlは以下の通りです
4.0.0
com.tong
spring-demo
1.0-SNAPSHOT
spring-demo
http://www.example.com
UTF-8
1.8
1.8
4.3.2.RELEASE
1.7.24
junit
junit
4.12
test
org.springframework
spring-context
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-core
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-expression
${spring.version}
org.springframework
spring-aop
${spring.version}
org.aspectj
aspectjweaver
1.8.8
org.springframework
spring-test
${spring.version}
org.springframework
spring-jdbc
${spring.version}
mysql
mysql-connector-java
5.1.22
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
slf4j-log4j12
${slf4j.version}
maven-clean-plugin
3.1.0
maven-resources-plugin
3.0.2
maven-compiler-plugin
3.8.0
maven-surefire-plugin
2.22.1
maven-jar-plugin
3.0.2
maven-install-plugin
2.5.2
maven-deploy-plugin
2.8.2
maven-site-plugin
3.7.1
maven-project-info-reports-plugin
3.0.0
プロジェクト階層説明イベント層
entity層はUser.javeエンティティ類を含み、POJO類であり、属性、コンストラクタとsetterのみを含み、getter方法である.
以下のとおりです
package com.tong.entity;
/**
* User
*
* @author tongl
* @version 1.0 11/11/2019
*/
public class User {
Integer id;
String name;
String sex;
Integer age;
public User() {
}
public User(Integer id, String name, String sex, Integer age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" + "id=" + this.id + ", name='" + this.name + '\'' + ", sex='" + this.sex + '\'' + ", age=" + this.age + '}';
}
}
ダオ層DAO層は主にデータの持続層の仕事をしています.データベースと連絡するいくつかのタスクはここにカプセル化されています.DAO層の設計はまずDAOのインターフェースを設計して、Springの配置ファイルの中でこのインターフェースの実現類を定義して、モジュールの中でこのインターフェースを呼び出してデータ業務の処理を行うことができます.構造が非常に明確であり、DAO層のデータソース構成及びデータベース接続に関するパラメータはSpringのプロファイルに配置されている.
インターフェースと実装を含む.
UserDao.java
package com.tong.dao;
import com.tong.entity.User;
/**
*
*
* @author tongl
*/
public interface UserDao {
/**
*
*
* @param user
*/
void addUser(User user);
/**
* id
*
* @param id id
*/
void deleteUser(int id);
/**
* id
*
* @param id id
*/
User getUser(int id);
/**
*
*
* @param user
*/
void updateUser(User user);
}
UserDaoImpl.javapackage com.tong.dao.impl;
import com.tong.dao.UserDao;
import com.tong.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
*
*
* @author tongl
*/
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
*
*
* @param user
*/
@Override
public void addUser(User user) {
jdbcTemplate.update("insert into t_user values(?,?,?,?)", user.getId(), user.getName(), user.getSex(), user.getAge());
}
/**
* id
*
* @param id id
*/
@Override
public void deleteUser(int id) {
jdbcTemplate.update("delete from t_user where id = ?", id);
}
/**
* id
*
* @param id id
* @return user
*/
@Override
public User getUser(int id) {
List users = jdbcTemplate.query("select * from t_user where id = ?",
new BeanPropertyRowMapper(User.class), id);
if (users != null && users.size() > 0) {
return users.get(0);
}
return null;
}
/**
*
*
* @param user
*/
@Override
public void updateUser(User user) {
jdbcTemplate.update("update t_user set name = ?, age = ?, sex = ? where id = ?",
user.getName(), user.getAge(), user.getSex(), user.getId());
}
}
サービス層Service層は主に業務モジュールの論理応用設計を担当しています.同様に、まずインターフェースを設計し、その実現されたクラスを設計し、次にSpringの配置ファイルにその実現された関連を配置する.このように、私たちはサービスインターフェースをアプリケーションに呼び出して、業務処理を行うことができます.Service層の業務実現は、定義されたDAO層のインターフェースを具体的に呼び出し、Service層を実装するトラヒックロジックは、汎用的なトラヒックロジックの独立性と重複利用性に寄与し、プログラムは非常に簡潔である.
UserService.java
package com.tong.service;
import com.tong.entity.User;
/**
*
*
* @author tongl
* @version 1.0 10/10/2019
*/
public interface UserService {
/**
*
*
* @param user
*/
void saveUser(User user);
/**
*
*
* @param id id
*/
void deleteUser(int id);
}
UserServiceImpl.javapackage com.tong.service.impl;
import com.tong.dao.UserDao;
import com.tong.entity.User;
import com.tong.service.UserService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
*
* @author tongl
*/
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
/**
*
*
* @param user
*/
@Override
public void saveUser(User user) {
Integer id = user.getId();
User u = userDao.getUser(id);
if (u == null) {
// user ,
userDao.addUser(user);
logger.info(" :{}", user);
} else {
// user ,
userDao.updateUser(user);
logger.info(" :{}", user);
}
}
/**
*
*
* @param id id
*/
@Override
public void deleteUser(int id) {
User user = userDao.getUser(id);
userDao.deleteUser(id);
logger.info(" :{}", user);
}
}
aop層ログカットを実現
Log.java
package com.tong.aop;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
/**
*
*
* @author tongl
*/
@Component
@ComponentScan(basePackages = {"com.fiberhome"})
@Aspect
@EnableAspectJAutoProxy
public class Log {
Logger logger = LoggerFactory.getLogger(Log.class);
/**
* : /
*/
@AfterReturning("execution(* com.tong.service.*.saveUser(..))")
public void addLog() {
logger.info(" / - ");
}
/**
* :
*/
@AfterReturning("execution(* com.tong.service.*.deleteUser(..))")
public void deleteLog() {
logger.info(" - ");
}
}
config本プロジェクトはJavaプロファイルを使用しています.ここはJavaプロファイルです.
DataConfig.java
package com.tong.conf;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
@Configuration
@ComponentScan(basePackages = {"com.tong"})
@PropertySource(value = "classpath:db.properties")
@Scope("singleton")
public class DataConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
*
*
* @return dataSource
*/
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
テストクラスUserServiceTest
package com.tong.service;
import com.tong.conf.DataConfig;
import com.tong.entity.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
*
* @author tongl
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {DataConfig.class})
public class UserServiceTest {
@Autowired
private UserService userService;
/**
*
*/
@Test
public void testAddUser(){
User user = new User(1001," "," ",17);
User user2 = new User(1001," "," ",20);
User user3 = new User(1012," "," ",18);
//System.out.println(user);
userService.saveUser(user);
userService.saveUser(user2);
userService.saveUser(user3);
}
/**
*
*/
@Test
public void testDeleteUser(){
userService.deleteUser(1001);
userService.deleteUser(1002);
}
}
レスキューファイルdb.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///user?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
log 4 j.properties### ###
log4j.rootLogger = info,stdout,D,E
### ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
### DEBUG logs/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### ERROR logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
ソースコードspring-demo