欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring学习笔记1之IOC详解尽量使用注解以及java代码

程序员文章站 2024-03-13 00:00:45
在实战中学习spring,本系列的最终目的是完成一个实现用户注册登录功能的项目。 预想的基本流程如下: 1、用户网站注册,填写用户名、密码、email、手机号信...

在实战中学习spring,本系列的最终目的是完成一个实现用户注册登录功能的项目。

预想的基本流程如下:

1、用户网站注册,填写用户名、密码、email、手机号信息,后台存入数据库后返回ok。(学习ioc,mybatis,springmvc的基础知识,表单数据验证,文件上传等)

2、服务器异步发送邮件给注册用户。(学习消息队列)

3、用户登录。(学习缓存、spring security)

4、其他。

边学习边总结,不定时更新。项目环境为intellij + spring4。

一、准备工作。

1、mysql中建库建表。

Spring学习笔记1之IOC详解尽量使用注解以及java代码

2、intellij中创建maven webapp工程。

(1) pom.xml中导入需要的依赖包。

<?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) 工程目录结构如下所示:

Spring学习笔记1之IOC详解尽量使用注解以及java代码

二、mybatis

1、配置mysql数据库的基本信息。

# 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,为单个类设置别名。-->
<!--<typealias type="com.everseeker.entity.user" alias="user" />-->
<!--第2种方法:使用package,为包下面的所有类设置别名,默认规则为com.everseeker.entity.user设置为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}肯定能找到对应的值 -->
<!-- 否则,如果直接在rootconfig.java中同事载入db.properties以及spring-mybatis.xml的话,不能保证db.properties先被引入,从而导致程序报错 -->
<context:property-placeholder location="classpath:db.properties"/>
<!--数据源配置 c3p0
常见的数据源实现类包有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}" />
<!--连接池中保留的最小连接数。 -->
<property name="minpoolsize" value="${db.minpoolsize}" />
<!--连接池中保留的最大连接数。default: 15 -->
<property name="maxpoolsize" value="${db.maxpoolsize}" />
<!--初始化时获取的连接数,取值应在minpoolsize与maxpoolsize之间。default: 3 -->
<property name="initialpoolsize" value="${db.initialpoolsize}" />
<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。default: 0 -->
<property name="maxidletime" value="${db.maxidletime}" />
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。default: 3 -->
<property name="acquireincrement" value="${db.acquireincrement}" />
<!--jdbc的标准参数,用以控制数据源内加载的preparedstatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
如果maxstatements与maxstatementsperconnection均为0,则缓存被关闭。default: 0 -->
<property name="maxstatements" value="${db.maxstatements}" />
<!--每60秒检查所有连接池中的空闲连接。default: 0 -->
<property name="idleconnectiontestperiod" value="${db.idleconnectiontestperiod}" />
<!--定义在从数据库获取新连接失败后重复尝试的次数。default: 30 -->
<property name="acquireretryattempts" value="${db.acquireretryattempts}" />
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getconnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。default: false -->
<property name="breakafteracquirefailure" value="${db.breakafteracquirefailure}" />
<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleconnectiontestperiod或automatictesttable
等方法来提升连接测试的性能。default: false -->
<property name="testconnectiononcheckout" value="${db.testconnectiononcheckout}" />
</bean>
<!-- mybatis配置.
classpath和classpath*的区别,参考文档: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映射文件
中定义过,则将他们动态定义为一个spring bean. -->
<property name="basepackage" value="com.everseeker.dao" />
<property name="sqlsessionfactorybeanname" value="sqlsessionfactory" />
</bean>
<!-- 事务管理器配置, 使用jdbc事务 -->
<bean id="transactionmanager"
class="org.springframework.jdbc.datasource.datasourcetransactionmanager">
<property name="datasource" ref="datasource" />
</bean>
<!-- 使用annotation定义事务,对标注了@transactional注解的bean进行处理,以织入事务管理切面.
默认情况下,自动使用名称为transactionmanager的事务管理器。
proxy-target-class为true,表示spring将通过创建子类来代理业务类,需要在类路径中添加cglib.jar类库。-->
<tx:annotation-driven transaction-manager="transactionmanager"
proxy-target-class="true" />
</beans>
spring-mybatis.xml

3、创建user类以及userdao接口。

public class user {
@size(min = 32, max = 32, message = "uuid应该为32位字符串")
private string id;
@size(min = 1, max = 32, message = "账号长度应该在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目录下创建usermapper.xml映射文件,实现userdao接口中的方法。注:*mapper.xml文件必须放在src/main/resources目录下,之前放在src/main/java/com/everseeker/dao目录下,产生了莫名奇妙的错误。

<?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、创建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:需要扫描的基础package。excludefilters: 符合filter条件的不扫描。

@importresource: 引入xml文件。

@propertysource: 引入properties文件。

2、由于创建的是webapp项目,并且采用了springmvc,那么dispatcherservlet是核心。以前的spring版本中,一般会配置在web.xml中。而在spring4中,可以在java代码中来实现。webappinitializer.java。

public class webappinitializer extends abstractannotationconfigdispatcherservletinitializer { //继承了abstractannotationconfigdispatcherservletinitializer的类会自动配置dispatcherservlet和spring应用上下文
@override
protected string[] getservletmappings() { //将dispatcherservlet映射到"/"
return new string[] { "/" };
}
/**
* rootconfig类用来配置contextloaderlistener创建的应用上下文中的bean,
* 比如@repository, @service等组件
*/
@override
protected class<?>[] getrootconfigclasses() {
return new class<?>[] { rootconfig.class };
}
/**
* dispatcherservlet加载应用上下文时,使用定义在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、创建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();
}
//配置静态资源的处理
@override
public void configuredefaultservlethandling(defaultservlethandlerconfigurer configurer) {
configurer.enable();
}
}

@bean: 声明这个方法会创建所需类型的实例,并注册为spring应用上下文中的bean。

以上所述是小编给大家介绍的spring学习笔记1之ioc详解尽量使用注解以及java代码,希望对大家有所帮助