6
回答
spring IoC和JFinal的集成
华为云实践训练营,热门技术免费实践!>>>   

@JFinal

我按照文档配置SpringPlugin,但是我在一些Interceptor和Listener上配置@Before(IocInterceptor.class)后没有自动注入。把IocInterceptor配置成全局的也是一样。

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

</beans>



Interceptor:

@Before(IocInterceptor.class)
public class AccessLogInterceptor implements Interceptor
{
  @Inject.BY_NAME
  private SessionService sessionService;
  
  @Override
  public void intercept(ActionInvocation ai)
  {
    ...
    sessionService.updateSession(session, url);
    ai.invoke();
  }
}




谁知道有没有不用SpringPlugin,直接用Spring的方法?

尝试了配置org.springframework.web.context.ContextLoaderListener没有成功。

举报
魔神翼
发帖于4年前 6回/2K+阅

    将  IocInterceptor 这个拦截器配置成全局的,或者配置在 Controller 上,然后使用 @Inject.BY_NAME、@Inject.BY_TYPE进行注入配置

  楼主代码中将 IocInterceptor 配置在了 Interceptor 之上,这肯定不会起作用,拦截器只能应用在 Controller 之上

--- 共有 2 条评论 ---
JFinal回复 @魔神翼 : 其实业务层不必须做成单例模式,如果你的业务层是无状态的可以在Controller 中来个 static Service service = new Service(),然后在actoin中可以共享使用这个业务对象。如果是有状态的,可以在每个action 中 new Service().doSomeThing()来用 4年前 回复
魔神翼我昨晚看了一下JFinal的源代码,模仿你的写法在我的service类里面添加了me()方法实现单例模式,IoC就放弃了。 4年前 回复

我一般推荐稍微大一些的项目用SpringSide,

而小网站应用使用JFinal。

其实两个都不错。SpringSide的Size很大。

--- 共有 1 条评论 ---
魔神翼我写的小网站,业余爱好而已。 4年前 回复

我现在的处理办法:
1)定义一个标记接口

public interface Service {
}



然后顶一个一个所有Service的管理类,兼顾通用和公共模块:
public class Services {
	private Services() {}
	/**
	 * 配置管理器
	 */
	private static Config config = PropertiesBaseConfig.getGloablConfig();
	
	//全局单例引擎
	private static EngineService engineService = new EngineServiceImpl();
	
	/**
	 * 其他的服务注册容器
	 */
	private static ConcurrentMap<String, Service> services = new ConcurrentHashMap<String, Service>(); 
	
	/**
	 * 静态初始化
	 */
	static{
		engineService.init();
		config.init();
	}
	
	/**
	 * @Description : 注册一个服务
	 * @param		:serviceName,注册的服务名
	 * @param		:service 服务
	 * @return      : void 返回类型
	 */
	public static void registService(String serviceName,Service service){
		services.put(serviceName, service);
	}
	
	/**
	 * @Description : 获取一个服务
	 * @param		:serviceName,注册的服务名
	 * @return      : 一个服务,或者为null(没有该服务的情况下)
	 */
	public static Service getService(String serviceName){
		return services.get(serviceName);
	}
	
	/**
	 * 获取单例配置管理器
	 */
	public static Config getConfig(){
		return config;
	}
	
	/**
	 * 获取单例引擎
	 */
	public static  EngineService getEngineService(){
		return engineService;
	}
	...




顶部