欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring學(xué)習(xí)筆記1之IOC詳解盡量使用注解以及java代碼

 更新時間:2016年07月18日 14:33:45   作者:everSeeker  
這篇文章主要介紹了Spring學(xué)習(xí)筆記1之IOC詳解盡量使用注解以及java代碼 的相關(guān)資料,需要的朋友可以參考下

在實戰(zhàn)中學(xué)習(xí)Spring,本系列的最終目的是完成一個實現(xiàn)用戶注冊登錄功能的項目。

預(yù)想的基本流程如下:

1、用戶網(wǎng)站注冊,填寫用戶名、密碼、email、手機號信息,后臺存入數(shù)據(jù)庫后返回ok。(學(xué)習(xí)IOC,mybatis,SpringMVC的基礎(chǔ)知識,表單數(shù)據(jù)驗證,文件上傳等)

2、服務(wù)器異步發(fā)送郵件給注冊用戶。(學(xué)習(xí)消息隊列)

3、用戶登錄。(學(xué)習(xí)緩存、Spring Security)

4、其他。

邊學(xué)習(xí)邊總結(jié),不定時更新。項目環(huán)境為Intellij + Spring4。

一、準備工作。

1、mysql中建庫建表。

2、Intellij中創(chuàng)建maven webapp工程。

(1) pom.xml中導(dǎo)入需要的依賴包。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.everSeeker</groupId>
<artifactId>register</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>register Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>4.3.1.RELEASE</spring.version>
</properties>
<dependencies>
<!--spring core, context-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<!--test-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--<scope>test</scope>-->
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--springmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--mysql, mybatis-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
</dependencies>
<build>
<finalName>java_config_web</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
</project>

(2) 工程目錄結(jié)構(gòu)如下所示:

二、Mybatis

1、配置mysql數(shù)據(jù)庫的基本信息。

# Database
db.mysql.driverClass = com.mysql.jdbc.Driver
db.mysql.jdbcUrl = jdbc:mysql://localhost:3306/register_notice?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
db.mysql.user = root
db.mysql.password = 333
db.minPoolSize = 10
db.maxPoolSize = 100
db.initialPoolSize = 20
db.maxIdleTime = 60
db.acquireIncrement = 5
db.maxStatements = 100
db.idleConnectionTestPeriod = 60
db.acquireRetryAttempts = 30
db.breakAfterAcquireFailure = true
db.testConnectionOnCheckout = false
db.properties

2、配置mybatis.xml以及spring-mybatis.xml。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置實體類的別名-->
<typeAliases>
<!--以下2種方法選其一即可。 第1種方法:使用typeAlias,為單個類設(shè)置別名。-->
<!--<typeAlias type="com.everSeeker.entity.User" alias="User" />-->
<!--第2種方法:使用package,為包下面的所有類設(shè)置別名,默認規(guī)則為com.everSeeker.entity.User設(shè)置為User,去除前面的包名。-->
<package name="com.everSeeker.entity" />
</typeAliases>
</configuration>
mybatis.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 在該文件中引入db.properties文件,可以保證之后的配置比如${db.mysql.driverClass}肯定能找到對應(yīng)的值 -->
<!-- 否則,如果直接在RootConfig.java中同事載入db.properties以及spring-mybatis.xml的話,不能保證db.properties先被引入,從而導(dǎo)致程序報錯 -->
<context:property-placeholder location="classpath:db.properties"/>
<!--數(shù)據(jù)源配置 c3p0
常見的數(shù)據(jù)源實現(xiàn)類包有2個,一個是apache的DBCP(org.apache.commons.dbcp.BasicDataSource),另一個為C3P0。
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="${db.mysql.driverClass}" />
<property name="jdbcUrl" value="${db.mysql.jdbcUrl}" />
<property name="user" value="${db.mysql.user}" />
<property name="password" value="${db.mysql.password}" />
<!--連接池中保留的最小連接數(shù)。 -->
<property name="minPoolSize" value="${db.minPoolSize}" />
<!--連接池中保留的最大連接數(shù)。Default: 15 -->
<property name="maxPoolSize" value="${db.maxPoolSize}" />
<!--初始化時獲取的連接數(shù),取值應(yīng)在minPoolSize與maxPoolSize之間。Default: 3 -->
<property name="initialPoolSize" value="${db.initialPoolSize}" />
<!--最大空閑時間,60秒內(nèi)未使用則連接被丟棄。若為0則永不丟棄。Default: 0 -->
<property name="maxIdleTime" value="${db.maxIdleTime}" />
<!--當(dāng)連接池中的連接耗盡的時候c3p0一次同時獲取的連接數(shù)。Default: 3 -->
<property name="acquireIncrement" value="${db.acquireIncrement}" />
<!--JDBC的標準參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量。但由于預(yù)緩存的statements 屬于單個connection而不是整個連接池。所以設(shè)置這個參數(shù)需要考慮到多方面的因素。
如果maxStatements與maxStatementsPerConnection均為0,則緩存被關(guān)閉。Default: 0 -->
<property name="maxStatements" value="${db.maxStatements}" />
<!--每60秒檢查所有連接池中的空閑連接。Default: 0 -->
<property name="idleConnectionTestPeriod" value="${db.idleConnectionTestPeriod}" />
<!--定義在從數(shù)據(jù)庫獲取新連接失敗后重復(fù)嘗試的次數(shù)。Default: 30 -->
<property name="acquireRetryAttempts" value="${db.acquireRetryAttempts}" />
<!--獲取連接失敗將會引起所有等待連接池來獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效 保留,并在下次調(diào)用getConnection()的時候繼續(xù)嘗試獲取連接。如果設(shè)為true,那么在嘗試
獲取連接失敗后該數(shù)據(jù)源將申明已斷開并永久關(guān)閉。Default: false -->
<property name="breakAfterAcquireFailure" value="${db.breakAfterAcquireFailure}" />
<!--因性能消耗大請只在需要的時候使用它。如果設(shè)為true那么在每個connection提交的 時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
等方法來提升連接測試的性能。Default: false -->
<property name="testConnectionOnCheckout" value="${db.testConnectionOnCheckout}" />
</bean>
<!-- myBatis配置.
classpath和classpath*的區(qū)別,參考文檔:http://blog.csdn.net/zl3450341/article/details/9306983.
classpath只會返回第一個匹配的資源,建議確定路徑的單個文檔使用classpath;匹配多個文檔時使用classpath*.
-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="classpath:mybatis.xml"
p:mapperLocations="classpath*:mapper/*Mapper.xml" />
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--basePackage指定要掃描的包,在此包之下的映射器都會被搜索到??芍付ǘ鄠€包,包與包之間用逗號或分號分隔
MapperScannerConfigurer將掃描basePackage所指定包下的所有接口類(包括子包),如果他們在SQL映射文件
中定義過,則將他們動態(tài)定義為一個Spring Bean. -->
<property name="basePackage" value="com.everSeeker.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- 事務(wù)管理器配置, 使用jdbc事務(wù) -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 使用annotation定義事務(wù),對標注了@Transactional注解的bean進行處理,以織入事務(wù)管理切面.
默認情況下,自動使用名稱為transactionManager的事務(wù)管理器。
proxy-target-class為true,表示spring將通過創(chuàng)建子類來代理業(yè)務(wù)類,需要在類路徑中添加CGLib.jar類庫。-->
<tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" />
</beans>
spring-mybatis.xml

3、創(chuàng)建User類以及UserDao接口。

public class User {
@Size(min = 32, max = 32, message = "uuid應(yīng)該為32位字符串")
private String id;
@Size(min = 1, max = 32, message = "賬號長度應(yīng)該在1-32位之間")
private String username;
@NotEmpty(message = "密碼不能為空")
private String password;
@NotEmpty(message = "email不能為空")
@Email(message = "email格式不正確")
private String email;
@Size(min = 11, max = 11, message = "手機號長度為11位")
private String cellphone;
private long regDate;
public User() {
this.id = UUID.randomUUID().toString().replaceAll("-", "");
this.regDate = 0;
}
public User(String username, String password, String email, String cellphone) {
this(username, password, email, cellphone, new Date().getTime());
}
public User(String username, String password, String email, String cellphone, long regDate) {
this.id = UUID.randomUUID().toString().replaceAll("-", "");
this.username = username;
this.password = password;
this.email = email;
this.cellphone = cellphone;
this.regDate = regDate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCellphone() {
return cellphone;
}
public void setCellphone(String cellphone) {
this.cellphone = cellphone;
}
public long getRegDate() {
return regDate;
}
public void setRegDate(long regDate) {
this.regDate = regDate;
}
@Override
public String toString() {
return "[User: id=" + id + ", username=" + username + ", password=" + password + ", email=" + email + ", cellphone=" +
cellphone + ", regDate=" + regDate + "]";
}
}
User.java

User.java中的@NotNull, @NotEmpty, @Size以及@Email等注釋暫時忽略,以后解釋。

@Repository
public interface UserDao {
void addUser(User user);
User getUserByUsername(String username);
}

4、在src/main/resources/mapper目錄下創(chuàng)建UserMapper.xml映射文件,實現(xiàn)UserDao接口中的方法。注:*Mapper.xml文件必須放在src/main/resources目錄下,之前放在src/main/java/com/everSeeker/dao目錄下,產(chǎn)生了莫名奇妙的錯誤。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.everSeeker.dao.UserDao">
<resultMap id="ResultMapUser" type="com.everSeeker.entity.User">
</resultMap>
<insert id="addUser" parameterType="User">
INSERT INTO user(id, username, password, email, cellphone, regDate) VALUES(#{id}, #{username}, #{password}, #{email}, #{cellphone}, #{regDate})
</insert>
<select id="getUserByUsername" parameterType="String" resultMap="ResultMapUser">
SELECT * FROM user WHERE username=#{username}
</select>
</mapper>
UserMapper.xml

三、IOC

1、創(chuàng)建IOC容器,通過注解方式,RootConfig.java。

@Configuration
@ComponentScan(basePackages = {"com.everSeeker"}, excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, value = RootConfig.WebPackage.class)})
@ImportResource({"classpath:spring-mybatis.xml"})
public class RootConfig {
public static class WebPackage extends RegexPatternTypeFilter {
public WebPackage() {
super(Pattern.compile("com\\.everSeeker\\.web"));
}
}
}

@Configuration: 表明這是一個配置類。

@ComponentScan: 啟用組建掃描,basePackages:需要掃描的基礎(chǔ)package。excludeFilters: 符合filter條件的不掃描。

@ImportResource: 引入xml文件。

@PropertySource: 引入properties文件。

2、由于創(chuàng)建的是webapp項目,并且采用了SpringMVC,那么DispatcherServlet是核心。以前的Spring版本中,一般會配置在web.xml中。而在Spring4中,可以在Java代碼中來實現(xiàn)。WebAppInitializer.java。

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { //繼承了AbstractAnnotationConfigDispatcherServletInitializer的類會自動配置DispatcherServlet和Spring應(yīng)用上下文
@Override
protected String[] getServletMappings() { //將DispatcherServlet映射到"/"
return new String[] { "/" };
}
/**
* RootConfig類用來配置ContextLoaderListener創(chuàng)建的應(yīng)用上下文中的bean,
* 比如@Repository, @Service等組件
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { RootConfig.class };
}
/**
* DispatcherServlet加載應(yīng)用上下文時,使用定義在WebConfig配置類中的bean,
* 用來加載包含Web組件的bean,比如控制器,視圖解析器以及處理器映射, @Controller, @RequestMapping等
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
//限制上傳文件的大小不超過2MB,整個請求不超過4M,所有上傳的文件都要寫到磁盤中
registration.setMultipartConfig(new MultipartConfigElement("/tmp/uploads", 2097152, 4194304, 0));
}
}

3、創(chuàng)建WebConfig.java。

@Configuration
@EnableWebMvc
@ComponentScan("com.everSeeker.web")
public class WebConfig extends WebMvcConfigurerAdapter {
//配置jsp視圖解析器
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resourceViewResolver = new InternalResourceViewResolver();
resourceViewResolver.setPrefix("/WEB-INF/views/");
resourceViewResolver.setSuffix(".jsp");
resourceViewResolver.setExposeContextBeansAsAttributes(true);
return resourceViewResolver;
}
//配置multipart解析器, 上傳文件用
@Bean
public MultipartResolver multipartResolver() throws IOException {
return new StandardServletMultipartResolver();
}
//配置靜態(tài)資源的處理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}

@Bean: 聲明這個方法會創(chuàng)建所需類型的實例,并注冊為Spring應(yīng)用上下文中的bean。

以上所述是小編給大家介紹的Spring學(xué)習(xí)筆記1之IOC詳解盡量使用注解以及java代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Mybatis-Plus同時使用邏輯刪除和唯一索引的問題及解決辦法(報數(shù)據(jù)重復(fù)Duplicate entry的問題)

    Mybatis-Plus同時使用邏輯刪除和唯一索引的問題及解決辦法(報數(shù)據(jù)重復(fù)Duplicate entry的

    在開發(fā)中,我們經(jīng)常會有邏輯刪除和唯一索引同時使用的情況,但當(dāng)使用mybatis plus時,如果同時使用邏輯刪除和唯一索引,會報數(shù)據(jù)重復(fù)Duplicate entry的問題,如何解決這個問題呢,小編給大家分享Mybatis-Plus同時使用邏輯刪除和唯一索引的問題及解決辦法,一起看看吧
    2023-11-11
  • 如何將IDEA打成jar包并在windows后臺運行

    如何將IDEA打成jar包并在windows后臺運行

    在本篇文章里小編給大家分享的是關(guān)于如何將IDEA打成jar包并在windows后臺運行知識點,需要的朋友們可以學(xué)習(xí)參考下。
    2019-08-08
  • Java中Date與String相互轉(zhuǎn)換的方法

    Java中Date與String相互轉(zhuǎn)換的方法

    這篇文章主要為大家詳細介紹了Java中Date與String相互轉(zhuǎn)換方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Mybatis-Plus 全局配置無效的解決方案

    Mybatis-Plus 全局配置無效的解決方案

    這篇文章主要介紹了Mybatis-Plus 全局配置無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring?Cloud?Feign?使用對象參數(shù)的操作

    Spring?Cloud?Feign?使用對象參數(shù)的操作

    這篇文章主要介紹了Spring?Cloud?Feign?如何使用對象參數(shù)的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java notify和notifyAll的區(qū)別和相同

    Java notify和notifyAll的區(qū)別和相同

    本文主要介紹Java notify和notifyAll的知識,這里整理詳細的資料來說明notify 和NotifAll的區(qū)別,有需要的小伙伴可以參考下
    2016-09-09
  • java中Pulsar?InterruptedException?異常

    java中Pulsar?InterruptedException?異常

    這篇文章主要為大家介紹了java中Pulsar?InterruptedException?異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 淺談Java非阻塞同步機制和CAS

    淺談Java非阻塞同步機制和CAS

    我們知道在java 5之前同步是通過Synchronized關(guān)鍵字來實現(xiàn)的,在java 5之后,java.util.concurrent包里面添加了很多性能更加強大的同步類。這些強大的類中很多都實現(xiàn)了非阻塞的同步機制從而幫助其提升性能。
    2021-06-06
  • Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題及解決辦法

    Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題及解決辦法

    這篇文章主要介紹了Java注解@Transactional事務(wù)類內(nèi)調(diào)用不生效問題及解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • WebUploader+SpringMVC實現(xiàn)文件上傳功能

    WebUploader+SpringMVC實現(xiàn)文件上傳功能

    WebUploader是由Baidu團隊開發(fā)的一個簡單的以HTML5為主,F(xiàn)LASH為輔的現(xiàn)代文件上傳組件。這篇文章主要介紹了WebUploader+SpringMVC實現(xiàn)文件上傳功能,需要的朋友可以參考下
    2017-06-06

最新評論