1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ylx252-spring-jfinal

Клонировать/Скачать
README.md 5.2 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 23:28 eb94a27

Интеграция Spring и JFinal (теоретически поддерживает все версии)

Зависимость jar Jfinal, javassist v3.*, Spring v3+ (для версий до 3.2.0 требуется зависимость cglib).

Использование Maven

    <dependency>
      <groupId>cc.ecore</groupId>
      <artifactId>spring-jfinal-plugin</artifactId>
      <version>x.x.x</version>
    </dependency>
  1. web.xml
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/spring.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <filter>
    <filter-name>jfinal</filter-name>
    <filter-class>com.jfinal.core.SpringJFinalFilter</filter-class>
    <init-param>
      <param-name>configClass</param-name>
      <param-value>com.demo.test.CommonConfig</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>jfinal</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Через SpringJFinalFilter загружается spring.

JfinalConfig автоматически регистрирует springbean (в JfinalConfig можно использовать аннотацию для внедрения свойств или реализовать интерфейс ApplicationContextAware для автоматического внедрения ApplicationContext).

Порядок инициализации:

  • без ContextLoaderListener: SpringJFinalFilter -> ApplicationContext -> JFinal -> JFinalConfig ... (остальное без изменений);
  • с ContextLoaderListener: ApplicationContext -> SpringJFinalFilter -> JFinal -> JFinalConfig ... (остальное без изменений).
  1. JFinalConfig
public class HelloJFinalConfig extends JFinalConfig {

  @Autowired
  public void setApplicationContext(ApplicationContext ctx) {
    System.out.println("HelloController attr[ApplicationContext] 已注入。。");
  }
  ...
}

В HelloJFinalConfig происходит автоматическое внедрение springbean, scope = "singleton".

  1. Controller
public class HelloController extends Controller {

  @Autowired
  public void setApplicationContext(ApplicationContext ctx) {
    System.out.println("HelloController attr[ApplicationContext] 已注入。。");
  }
}

В Controller происходит автоматическое внедрение springbean, scope = "prototype", так как jfinal создаёт экземпляр при каждом запросе.

  1. Управление транзакциями spring
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
  <property name="username" value="${db.userName}" />
  <property name="password" value="${db.passWord}" />
  <property name="url" value="${db.jdbcUrl}" />
  <property name="driverClassName" value="${db.driverClassName}" />
  <property name="initialSize" value="${db.initialSize}" />
  <property name="maxActive" value="${db.maxActive}" />
  <property name="minIdle" value="${db.minIdle}" />
</bean>
<!-- spring 事物管理 ,ActiveRecordPlugin可以获得此 dataSource 可以把事务交给spring 管理 -->
<bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
  <property name="targetDataSource" ref="druidDataSource" />
</bean>

<!-- ================================事务相关控制================================================= -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSourceProxy"></property>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="delete*" propagation="REQUIRED" read-only="false" />
    <tx:method name="insert*" propagation="REQUIRED" read-only="false" />
    <tx:method name="update*" propagation="REQUIRED" read-only="false" />

    <tx:method name="find*" propagation="SUPPORTS" />
    <tx:method name="get*" propagation="SUPPORTS" />
    <tx:method name="select*" propagation="SUPPORTS" />
  </tx:attributes>
</tx:advice>

<!-- 把事务控制在Service层 -->
<aop:config>
  <aop:pointcut id="pc" expression="execution(public * demo.service.*.*(..))" />
  <aop:advisor pointcut-ref="pc" advice-ref="txAdvice" />
</aop:config>

Здесь основное внимание уделяется внедрению прокси-сервера данных в ActiveRecordPlugin.

  1. Запуск jetty
public static void main(String[] args) {
  CtFactory.toClass();// 这个必须启动前执行
  // ...
}
  1. Дополнительная поддержка

JFinal Weixin SDK

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/ylx252-spring-jfinal.git
git@api.gitlife.ru:oschina-mirror/ylx252-spring-jfinal.git
oschina-mirror
ylx252-spring-jfinal
ylx252-spring-jfinal
master