Spring框架

166 阅读1分钟

一、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>