spring的核心配置
Spring框架的核心配置主要包括以下几个方面:
依赖注入(Dependency Injection, DI)
依赖注入是Spring的核心特性之一,它通过将依赖(如对象、服务等)注入到组件中,实现了组件间的松耦合。
常见的依赖注入方式:
-
构造器注入(Constructor Injection)
java复制
public class Car { private Engine engine; public Car(Engine engine) { this.engine = engine; } }
在Spring配置文件中:
xml复制
<bean id="engine" class="com.example.Engine"/> <bean id="car" class="com.example.Car"> <constructor-arg ref="engine"/> </bean>
-
Setter注入(Setter Injection)
java复制
public class Car { private Engine engine; public void setEngine(Engine engine) { this.engine = engine; } }
在Spring配置文件中:
xml复制
<bean id="engine" class="com.example.Engine"/> <bean id="car" class="com.example.Car"> <property name="engine" ref="engine"/> </bean>
-
字段注入(Field Injection)
java复制
public class Car { @Autowired private Engine engine; }
此方式不推荐用于核心组件,因为它会破坏测试和代码的可读性。
基于XML的配置
这是Spring最传统的配置方式,通过XML文件定义Bean和其他配置。
xml复制
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义一个Bean -->
<bean id="userService" class="com.example.UserService"/>
<!-- 定义另一个Bean,并注入依赖 -->
<bean id="userController" class="com.example.UserController">
<property name="userService" ref="userService"/>
</bean>
</beans>
基于注解的配置
这是一个更现代的方式,通过Java注解(如@Component
, @Service
, @Repository
, @Autowired
等)来定义和配置Bean。
java复制
// 使用@Component注解定义一个Bean
@Component
public class UserService {
// ...
}
// 使用@Autowired注解注入依赖
@Service
public class UserController {
@Autowired
private UserService userService;
}
在主程序或配置类中启用注解扫描:
java复制
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// ...
}
Spring Boot的自动配置
Spring Boot通过自动配置(如@EnableAutoConfiguration
)简化了Spring框架的使用。
java复制
@SpringBootApplication // 启用自动配置、组件扫描和配置文件
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
配置类(Java-Based Configuration)
通过Java类(配合@Configuration
注解)来配置Bean,这是一种类型安全的方式。
java复制
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
@Bean
public UserController userController(UserService userService) {
UserController controller = new UserController();
controller.setUserService(userService);
return controller;
}
}
配置文件(如application.properties
或application.yml
)
用于存储应用程序的配置参数,支持多种格式和环境配置。
application.properties
示例:
properties复制
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
application.yml
示例:
yaml复制
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
AOP(面向切面编程)
Spring支持通过AOP实现横向业务逻辑的抽取(如日志、事务等)。
定义切面:
java复制
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
System.out.println("Method " + joinPoint.getSignature().getName() + " is executing.");
}
}
事务管理
Spring支持声明式事务管理(基于注解或XML配置)。
基于注解的事务管理:
java复制
@Service
@Transactional
public class UserService {
@Autowired
private UserRepository userRepository;
public void saveUser(User user) {
userRepository.save(user);
}
}
基于XML的事务管理:
xml复制
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="get*" read-only="true"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="userServicePointcut" expression="execution(* com.example.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="userServicePointcut"/>
</aop:config>
总结
Spring的核心配置主要围绕依赖注入、配置方式(XML、注解、Spring Boot自动配置、Java配置类)、AOP、事务管理等展开。通过合理配置,可以构建灵活、可维护的企业级应用。