-
轻量级 Spring采用了轻量级的设计原则,核心容器的大小很小,可以灵活地部署和使用。
-
依赖注入(Dependency Injection,DI):通过IoC容器将对象之间的依赖关系进行解耦,使得应用程序更加灵活和可测试。
-
控制反转(Inversion of Control,IoC):由Spring容器主动创建和管理对象,并负责对象间的依赖关系,而不是由开发者手动管理。
-
面向切面编程(Aspect-Oriented Programming,AOP):通过在应用程序中插入切面来解决横切关注点的问题,例如日志、事务、安全等。
-
数据访问(Data Access):Spring提供了对数据库访问的支持,包括JDBC、ORM(对象关系映射)框架如Hibernate、MyBatis等。
-
Web开发支持:Spring MVC是一种基于MVC(Model-View-Controller)设计模式的Web框架,简化了Web应用程序的开发和测试。
-
安全性(Security):Spring Security提供了一套全面的认证和授权解决方案,用于保护应用程序的安全性。
-
测试支持:Spring框架提供了丰富的测试支持,例如通过JUnit对代码进行单元测试、Mock对象来模拟依赖等。
Spring 的优势
-
松耦合和高度可测试性:
-
声明式事务管理:Spring提供了声明式事务管理的机制,可以通过简单的配置来管理事务。开发者不需要手动处理事务的启动、提交和回滚等操作,而是通过注解或XML配置来定义事务边界,简化了事务管理的编码过程。
-
AOP支持:Spring对面向切面编程(AOP)提供了强大的支持。通过切面的方式,可以将通用的横切关注点(如日志、事务、安全等)与业务逻辑分离,实现了更好的模块化和复用性。
-
容器管理:Spring框架提供了一个IoC(Inversion of Control,控制反转)容器,负责管理对象的创建、销毁和生命周期等。开发者只需要通过配置文件或注解描述对象的依赖关系,而不需要手动管理对象的创建和销毁,提高了开发效率。
-
数据访问支持:Spring对数据访问提供了丰富的支持,包括对JDBC、ORM框架(如Hibernate、MyBatis)和NoSQL数据库的集成。通过简化数据访问的代码,提供了更高层次的抽象,使得开发者可以更方便地操作和管理数据。
-
灵活性和可扩展性:Spring框架采用模块化的设计,由多个独立的模块组成,每个模块都提供不同的功能。开发者可以根据需求选择性地使用这些模块,从而实现灵活和轻量级的应用程序开发,并且可以很容易地集成第三方库或自定义功能。
-
社区支持和丰富的生态系统:Spring是一个非常流行的开源框架,拥有庞大的开发者社区和丰富的生态系统。在社区中,您可以获得大量的文档、教程、示例代码和问题解答,以及与其他开发者的交流和分享经验。
实战思路
咱先建个user类 ,mapper包service这些搭好。
package domain;
import lombok.Data;
@Data
public class User {
private Integer id;
private String name;
private Integer gradeid;
}
mapper包
package mapper;
import domain.User;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserMapper {
List<User> getAllUser();
}
service包
package service;
import domain.User;
import java.util.List;
public interface UserService {
List<User> getAllUser();
}
package service;
import domain.User;
import mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("userService")
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
@Override
public List<User> getAllUser() {
return userMapper.getAllUser();
}
}
resources测试资源根下
applicationContext.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"
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">
<!--1.配置数据源-->
<context:property-placeholder location="database.properties"></context:property-placeholder>
<!--4.2第二部 配置环境 给数据源添加首饰-->
<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="url" value="${url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--配置SqlSessionFactory-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="datasource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!--配置扫描包-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper"></property>
</bean>
<context:component-scan base-package="service"/>
</beans>
database.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3350/cvs_db?characterEncoding=utf-8&serverTimezone=UTC
jdbc.username=root
jdbc.password=root
log4j.properties
log4j.rootLogger=DEBUG,CONSOLE,file
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.cvs.dao=debug
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug
######################################################################################
# Console Appender \u65E5\u5FD7\u5728\u63A7\u5236\u8F93\u51FA\u914D\u7F6E
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n
######################################################################################
# DailyRolling File \u6BCF\u5929\u4EA7\u751F\u4E00\u4E2A\u65E5\u5FD7\u6587\u4EF6\uFF0C\u6587\u4EF6\u540D\u683C\u5F0F:log2009-09-11
######################################################################################
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=error
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
log4j.logger.com.opensymphony.xwork2=error
mybatis-config.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>
<!-- 这里可以定义命名空间或其他全局设置 -->
<!-- <properties resource="database.properties"></properties>-->
<settings>
<setting name="autoMappingBehavior" value="FULL"/>
<setting name="logImpl" value="LOG4J"/>
<!-- <setting name="cacheEnabled" value="true"/>-->
</settings>
<typeAliases>
<package name="domain"/>
<!-- <package name="vo"/>-->
</typeAliases>
<!--2.设置 日志 缓存 自动匹配-->
<!-- <settings>
<setting name="logImpl" value="LOG4J"/>
</settings>-->
<!--3.环境配置-->
<!-- <environments default="development">
<environment id="development">
<!–mybatis对JDBC封装–>
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>-->
<mappers>
<mapper resource="mapper/UserMapper.xml"></mapper>
<!--映射文件位于统一包路径下-->
</mappers>
</configuration>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<!-- 1.Spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 2.Spring dao依赖-->
<!-- spring-jdbc包括了一些如jdbcTemplate的工具类-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 3.Spring web依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!-- 4.Spring test依赖:方便做单元测试和集成测试 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.5</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.8</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jboss-vfs</artifactId>
<version>3.2.15.Final</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
</dependencies>
建议这里慢慢的添加jar包依赖,新手不要把这些依赖一下子加进去只拿自己要用的依赖就行了。
再来到resources测试资源根下的mapper包
UserMapper.xml
<?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="mapper.UserMapper">
<select id="getAllUser" resultType="User">
select * from user
</select>
</mapper>
测试结果:
Spring总结
-
在Spring容器中,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IOC,一句话搞定就是:对象由Spring创建,管理,装配!
-
在Spring容器中,用户如果想要访问不同的数据,只需在bean.xml文件中进行配置即可。不需要操纵其他的代码。测试文件也是可以写死的。因此使用了Spring容器之后,程序员把主要的精力放在实现业务逻辑以及系统性能上面即可。
-
并且在bean中可以绑定dao层的所有内容,每个类只需要一行代码即可,非常方便。
-
Spring在我们创建bean.xml的时候它已经帮我们实例化了。我们在测试的时候,及时你没有new其它类中无参构造的内容,那些内容也会自动输出。------得到的想法:在以后项目开发的时候不要在无参构造中写入内容,除非是想每次都让项目输出一个特定的结果。