目录
一、spring简介
1.什么是spring
Spring是一个轻量级的开源Java框架,用于构建企业级应用程序。它提供了一个全面的编程和配置模型,可以用于开发各种类型的应用,包括Web应用、移动应用、微服务等。
Spring框架以其轻量级、灵活、可扩展的特点,成为Java开发中广泛使用的框架之一。它简化了开发过程,提高了代码的可维护性和可测试性,帮助开发人员快速构建高质量的应用程序。
2.spring的核心
Spring的核心是IoC(控制反转)和AOP(面向切面编程)两个特性。IoC通过将对象的创建和依赖关系的管理交给容器来实现,从而降低了类之间的耦合性。AOP则通过在不修改原有代码的情况下,对系统进行横切关注点的增加,提供了更好的代码重用和模块化。
2.1IOC(控制反转)
Spring IOC(控制反转)是Spring框架的一个重要特性。Spring IOC是一种设计原则,它允许框架控制应用程序的流程,提供依赖关系并管理它们的生命周期。该框架负责创建和管理应用程序所需的对象(bean)。而不是应用程序负责实例化对象和管理它们的依赖关系,Spring IOC会创建对象并将依赖关系注入到它们中。
IOC 的底层实现原理(工厂+反射+配置文件)
优点
松耦合:通过将对象的创建和依赖关系管理责任从应用程序中移除,可以实现松耦合的组件之间的交互。组件可以轻松地进行替换或修改,而不会影响应用程序的其他部分。
依赖注入:Spring IOC允许进行依赖注入,这是一种从外部源(如XML配置文件或注解)提供对象的依赖关系的机制。这简化了代码,并使更改或配置依赖关系变得更容易。
可测试性:Spring IOC使得为组件编写单元测试变得更容易,因为它允许依赖关系被轻松地模拟或存根。这促进了更好的测试实践,并提高了应用程序的整体质量。
2.2 AOP(面向切面编程)
AOP (Aspect-Oriented Programming) 是一种编程范式,旨在将横切关注点(cross-cutting concerns)与应用程序的核心业务逻辑分离开来。在传统的面向对象编程中,例如日志记录、错误处理和安全性等关注点通常分散在多个组件中,使得代码难以理解和维护。AOP 提供了一种模块化这些关注点的方式,引入了切面(aspect)的概念。
优点
横切关注点分离:AOP 允许开发人员将横切关注点(如日志记录、性能监控、异常处理等)与核心业务逻辑分开,使代码更加清晰和可维护。
代码重用和模块化:通过将关注点定义为切面,可以将它们应用于多个组件中,避免了代码重复。这样,开发人员可以更好地实现代码的模块化和重用。
简化核心业务逻辑:AOP 可以通过将非业务相关的代码移出核心逻辑,使核心逻辑更加简洁和易于理解。
高层次的抽象:AOP 提供了一种在业务逻辑层次之上操作的方式,使开发人员能够更加关注业务需求而不用过多考虑底层的实现细节。
声明式编程:AOP 允许开发人员通过声明方式来指定切面的逻辑,而不是在代码中显式地编写关注点的实现。这样,代码更加简洁和可读性更强。
代码解耦和灵活性:通过使用 AOP,开发人员可以将关注点和核心逻辑解耦,使系统更加灵活和易于扩展。
二、 配置步骤
1.导入jar包
2. 引入相关配置文件
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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
</beans>
log4j.properties
### direct log messages to stdout ###
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=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=error, stdout
log4j.logger.com.springframework=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
3.编写相关类
接口UserDao
public interface UserDao {
public void add();
}
接口实现类UserDaoImpl
import com.test.mapper.UserDao;
import org.springframework.stereotype.Component;
@Component(value="userDao")
public class UserDaoImpl implements UserDao {
@Override
public void add() {
System.out.println("添加成功");
}
}
测试类
import com.test.domain.User;
import com.test.mapper.OrderDao;
import com.test.mapper.UserDao;
import com.test.mapper.impl.UserDaoImpl;
import com.test.mytest.BeanFactory;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestDemo {
@Test
public void test2(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao)applicationContext.getBean("userDao");
userDao.add();
}
}
4.配置 applicationContext.xml文件
<!-- Spring 的注解开发:组件扫描(类上注解: 可以直接使用属性注入的注解) -->
<context:component-scan base-package="<!--填写需要扫描类的文件夹路径-->"></context:component-scan>