目录
介绍
Spring框架是一个轻量级的企业级应用框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益
优点
Spring框架的优点有以下几点:
1.低侵入式设计
2.独立于各种应用服务器
3.依赖注入特性将组件关系透明化,降低耦合度
4.面向切面编程特性允许将通用任务进行集中式处理
5.与第三方框架的良好整合
体系结构
核心技术
Spring的核心技术有两个分别是控制反转(IoC)和面向切面编程(AOP)
控制反转(IoC)
Spring IOC(Inversion of Control)是一个设计模式,也称为依赖注入(DI)。它是Spring框架的核心,用于管理bean(Java对象)的创建和依赖关系。在Spring IOC中,对象的创建和组装由Spring容器负责而不是由开发人员手动进行。Spring IOC容器维护着一个bean工厂,它创建并管理所有的bean,以及它们的依赖关系。使用Spring IOC可以实现代码的松耦合,提高应用程序的可维护性和可扩展性。
所需的相关依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
以下是一个简单的实现Spring IOC容器的示例代码:
定义一个接口:
public interface MessageService {
String getMessage();
}
实现接口:
public class MessageServiceImpl implements MessageService {
@Override
public String getMessage() {
return "Hello, World!";
}
}
定义配置类:
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public MessageService messageService() {
return new MessageServiceImpl();
}
}
创建ApplicationContext:
public class App {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MessageService messageService = context.getBean(MessageService.class);
System.out.println(messageService.getMessage());
}
}
输出结果:
Hello, World!
面向切面编程(AOP)
Spring AOP(Aspect-Oriented Programming)是Spring框架的一个重要模块,它提供了一种面向切面编程的方法,用于在不破坏原有代码结构的情况下,将横切关注点(如日志记录、性能统计、安全控制、事务处理等)从业务逻辑中分离出来。
在Spring中,AOP通过定义切面(Aspect)来实现横切关注点的功能,切面定义了哪些方法在什么时候和哪些对象上执行。在Spring AOP中,切面可以通过XML配置文件、注解或者Java代码方式进行定义。
Spring AOP采用的是动态代理技术,在运行时动态地为目标对象创建代理对象,代理对象就可以截获目标对象的方法调用,并在调用前、调用后、异常抛出时等不同的时间点执行相应的切面代码。
下面是一个简单的Spring AOP示例,用于在方法执行前和执行后记录日志:
1.创建一个接口
public interface Calculator {
int add(int a, int b);
}
2.创建一个实现接口的类
public class CalculatorImpl implements Calculator {
@Override
public int add(int a, int b) {
return a + b;
}
}
3.创建一个切面
@Component
@Aspect
public class LoggingAspect {
@Before("execution(public int Calculator.add(int, int))")
public void before(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println("Calling method " + methodName + " with args " + Arrays.toString(args));
}
@AfterReturning(pointcut = "execution(public int Calculator.add(int, int))", returning = "result")
public void afterReturning(JoinPoint joinPoint, Object result) {
String methodName = joinPoint.getSignature().getName();
System.out.println("Method " + methodName + " returned " + result);
}
}
4.配置Spring AOP
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
@Bean
public Calculator calculator() {
return new CalculatorImpl();
}
@Bean
public LoggingAspect loggingAspect() {
return new LoggingAspect();
}
}
5.使用Spring AOP
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Calculator calculator = context.getBean(Calculator.class);
int result = calculator.add(2, 3);
System.out.println("Result: " + result);
}
这个示例展示了如何使用Spring AOP记录日志,需要注意的是,要使用AspectJ注释,在@Configuration类上启用@EnableAspectJAutoProxy,并将切面注入Spring上下文。
配置spring核心文件
1.创建一个数据源配置文件
<!-- 数据源配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
2.创建一个MyBatis SQL Session配置文件
<!-- MyBatis SQL Session 配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
3.创建一个MyBatis配置文件
<!-- MyBatis配置文件 mybatis-config.xml -->
<configuration>
<mappers>
<mapper resource="com/example/mapper/UserMapper.xml" />
</mappers>
</configuration>
4.配置Spring
<!-- 配置Spring -->
<context:annotation-config />
<context:component-scan base-package="com.example.*" />
<import resource="classpath:datasource-config.xml" />
<import resource="classpath:mybatis-sqlsession-config.xml" />
5.使用数据库操作
@Repository
public class UserDaoImpl implements UserDao {
private SqlSession sqlSession;
@Autowired
public UserDaoImpl(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
@Override
public User getUserById(int id) {
return sqlSession.selectOne("com.example.mapper.UserMapper.getUserById", id);
}
}
这个示例展示了如何使用Spring配置文件配置数据源和MyBatis SQL Session以及如何使用自动装配将SQL Session注入DAO实现类中,需要注意的是,要在Spring配置文件中导入数据源配置文件和MyBatis SQL Session配置文件。