一、IoC容器 IoC(Inversion of Control)即控制反转,是Spring框架最基本的特性之一。它通过将对象的创建、依赖关系管理和生命周期管理交给Spring容器来完成,降低了代码的耦合度,提高了可维护性和测试性。
示例代码:
public class HelloWorld {
private String message;
// 通过setter方法注入message属性的值
public void setMessage(String message) {
this.message = message;
}
public void printMessage() {
System.out.println("Hello, " + message);
}
}
public class Main {
public static void main(String[] args) {
// 创建Spring容器
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 从容器中获取HelloWorld对象
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");
// 调用方法
helloWorld.printMessage();
}
}
二、依赖注入 依赖注入(Dependency Injection)是IoC的一种具体实现方式,它通过注入对象的依赖关系来实现对象之间的解耦。Spring框架提供了多种依赖注入的方式,如构造函数注入、属性注入和方法注入。
示例代码:
public class UserService {
private UserDao userDao;
// 构造函数注入
public UserService(UserDao userDao) {
this.userDao = userDao;
}
// 属性注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
// 方法注入
public void init() {
// 初始化操作
}
}
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 创建UserService对象,并注入UserDao依赖
UserService userService = (UserService) context.getBean("userService");
// 调用方法
userService.init();
}
}
三、AOP支持 AOP(Aspect-Oriented Programming)即面向切面编程,它能够将横切关注点(如日志、事务)与核心业务逻辑分离开来,提高了代码的可维护性和可重用性。Spring框架提供了强大的AOP支持,可以通过配置或注解的方式来定义切面。
示例代码:
public class LoggingAspect {
public void beforeLog(JoinPoint joinPoint) {
System.out.println("Before method: " + joinPoint.getSignature().getName());
}
public void afterLog(JoinPoint joinPoint, Object result) {
System.out.println("After method: " + joinPoint.getSignature().getName());
}
}
public interface UserService {
void saveUser(User user);
}
public class UserServiceImpl implements UserService {
public void saveUser(User user) {
System.out.println("Saving user: " + user.getName());
}
}
// 配置切面
<aop:config>
<aop:aspect ref="loggingAspect">
<aop:before method="beforeLog" pointcut="execution(* com.example.UserService.saveUser(..))" />
<aop:after-returning method="afterLog" pointcut="execution(* com.example.UserService.saveUser(..))" returning="result" />
</aop:aspect>
</aop:config>