更新时间: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类去实现。