更新时间:2023年04月13日11时38分 来源:传智教育 浏览次数:
Spring框架是一个广泛应用于Java企业级应用程序开发的轻量级框架,它借鉴了许多设计模式来实现其各种功能。
下面是Spring中常见的几种设计模式及其应用:
Spring中的Bean默认是单例模式,即只创建一个Bean实例并在整个应用程序中共享它。这种方式可以提高性能和减少内存占用。
以下是一个简单的示例,展示如何在Spring中配置一个单例Bean:
<bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton"/>
Spring使用工厂模式来管理对象的创建和生命周期。例如,Spring的ApplicationContext接口就是一个工厂,它可以创建和管理Bean实例。
以下是一个示例,展示如何在Spring中配置一个工厂Bean:
<bean id="myFactoryBean" class="com.example.MyFactoryBean">
<property name="someProperty" value="someValue"/>
</bean>
Spring使用代理模式来实现AOP(面向切面编程),该模式允许在方法调用前、调用后或抛出异常时执行某些额外的操作,如日志记录、事务管理等。
以下是一个示例,展示如何在Spring中配置一个代理Bean:
<bean id="myTargetBean" class="com.example.MyTargetBean"/>
<bean id="myAdvice" class="com.example.MyAdvice"/>
<bean id="myProxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="myTargetBean"/>
<property name="interceptorNames">
<list>
<value>myAdvice</value>
</list>
</property>
</bean>
Spring 中的事件机制使用了观察者模式,它允许多个对象对某个事件进行观察,并在事件发生时自动执行相应的操作。
以下是一个示例,展示如何在 Spring 中使用事件机制:
public class MyEvent extends ApplicationEvent {
public MyEvent(Object source) {
super(source);
}
}
public class MyListener implements ApplicationListener<MyEvent> {
@Override
public void onApplicationEvent(MyEvent event) {
System.out.println("Received event: " + event);
}
}
public class MyPublisher {
private final ApplicationEventPublisher publisher;
public MyPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
public void publishEvent() {
publisher.publishEvent(new MyEvent(this));
}
}
@Configuration
public class AppConfig {
@Bean
public MyListener myListener() {
return new MyListener();
}
@Bean
public MyPublisher myPublisher(ApplicationEventPublisher publisher) {
return new MyPublisher(publisher);
}
}
在这个示例中,MyEvent是一个自定义事件,MyListener是一个事件监听器,MyPublisher是一个事件发布者。在AppConfig中,我们将MyListener和 MyPublisher注册为Spring Bean,MyPublisher 构造函数中注入了 ApplicationEventPublisher,它是一个接口,用于发布事件。在 MyPublisher 的 publishEvent 方法中,我们发布了一个 MyEvent 事件,MyListener 将会监听该事件并在事件发生时打印一条消息。
Spring中的JdbcTemplate和HibernateTemplate 等模板类使用了模板方法模式,它允许将一些通用的代码逻辑放在抽象父类中,而将具体的实现细节留给子类去实现。
以下是一个简单的示例,展示如何在 Spring 中使用 JdbcTemplate:
public class MyDao {
private final JdbcTemplate jdbcTemplate;
public MyDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<MyObject> getMyObjects() {
return jdbcTemplate.query("SELECT * FROM my_table", new MyObjectRowMapper());
}
private static class MyObjectRowMapper implements RowMapper<MyObject> {
@Override
public MyObject mapRow(ResultSet rs, int rowNum) throws SQLException {
MyObject myObject = new MyObject();
myObject.setId(rs.getLong("id"));
myObject.setName(rs.getString("name"));
return myObject;
}
}
}
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
// configure and return a data source
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean
public MyDao myDao(JdbcTemplate jdbcTemplate) {
return new MyDao(jdbcTemplate);
}
}
在这个示例中,MyDao类使用了JdbcTemplate来查询数据库。JdbcTemplate提供了一组通用的查询方法,例如query和update,可以直接执行SQL语句并返回结果。在MyDao的getMyObjects方法中,我们使用了 JdbcTemplate的query方法来查询my_table表中的数据,并使用MyObjectRowMapper类将结果映射成MyObject对象。MyObjectRowMapper实现了RowMapper接口,它将ResultSet中的每一行数据映射成一个MyObject对象。
在AppConfig中,我们配置了一个DataSource和一个JdbcTemplate,并将JdbcTemplate注入到 MyDao中。通过这种方式,我们可以将数据库访问的通用逻辑放在JdbcTemplate中,而将具体的SQL语句和对象映射逻辑留给 MyDao类去实现。