教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

Spring中都应用了哪些设计模式?

更新时间:2023年04月13日11时38分 来源:传智教育 浏览次数:

好口碑IT培训

  Spring框架是一个广泛应用于Java企业级应用程序开发的轻量级框架,它借鉴了许多设计模式来实现其各种功能。

  下面是Spring中常见的几种设计模式及其应用:

  1.单例模式

  Spring中的Bean默认是单例模式,即只创建一个Bean实例并在整个应用程序中共享它。这种方式可以提高性能和减少内存占用。

  以下是一个简单的示例,展示如何在Spring中配置一个单例Bean:

<bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton"/>

  2.工厂模式

  Spring使用工厂模式来管理对象的创建和生命周期。例如,Spring的ApplicationContext接口就是一个工厂,它可以创建和管理Bean实例。

  以下是一个示例,展示如何在Spring中配置一个工厂Bean:

<bean id="myFactoryBean" class="com.example.MyFactoryBean">
    <property name="someProperty" value="someValue"/>
</bean>

  3.代理模式

  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>

  4.观察者模式

  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 将会监听该事件并在事件发生时打印一条消息。

  5.模板方法模式

  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类去实现。

0 分享到:
和我们在线交谈!