大家都知道,Spring在JavaEE开发中扮演着非常重要的地位。
可以利用它的依赖注入(DI)很好的实现各个模块直接的解耦。可以利用它的AOP很好的实现面向方面的编程,实现与事务无关的业务逻辑(事务代码写在切面中)可以使用不同的注解(@Controller;@Service;@Repository)很好的实现分成架构, 表明各个模块的作用可以用MVC实现的Controller很好的处理请求和响应客户端请求可以轻松的使用集成其他第三方组件实现的功能等。
那这么好的功能,如何能在Android上使用呢,服务于Android开发者呢?

现在给大家推荐一个第三方库, 可以很方便的集成到您的应用里面,获取以上这些功能

项目地址:https://github.com/hianzuo/android-springIntroduction

Android-spring is a android library project support IOC , DI , AOP and HTTP/Handler , it use annotation to config 。 It contains a simple project.

Add the dependency

dependencies {   compile 'com.hianzuo.android:LibSpring:1.0.4' }Init spring from Application

public class SimpleApplication extends Application { @Override public void onCreate() { super.onCreate(); //if in dev mode ,please line blow code SpringInitializer.devMode(); //spring init, you can add more package to scan spring component. SpringInitializer.init(this, "com.hianzuo.spring.simple.test.", "other package to scan spring component"); }}DI Support in Activity

public class MainActivity extends AppCompatActivity { @Resource private TestService testService; @Resource private PrintService printService; @Resource(beanName = "testBean") private BeanTest testBean; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); testService.handle(); setContentView(R.layout.activity_main); TextView tv = findViewById(R.id.tv); tv.setText(printService.print() + "\n\n" + testBean.getText()); }}Configuration Bean

@Component@Configurationpublic class TestConfiguration { @Bean("testBean") public BeanTest bean1() { return new BeanTest("bean name in annotation"); } @Bean public BeanTest methodIsBeanName() { return new BeanTest("method is bean name"); }}AOP

@Aspectpublic class TestServiceAspect { @Pointcut("^.*?handle\\(\\).*+$") public void handle() { System.out.println("AAA TestServiceAspect handle"); } @Before("handle") public void before(JointPoint point) { System.out.println("AAA TestServiceAspect before"); } @Around(value = "handle") public Object around(JointPoint point) { System.out.println("AAA TestServiceAspect around start"); Object result = point.invokeResult(); System.out.println("AAA TestServiceAspect around end"); return result; } @After(value = "handle") public void after(JointPoint point) { System.out.println("AAA TestServiceAspect after"); }Service Annotation Support

@Servicepublic class TestServiceImpl implements TestService { @Resource private PrintService printService; @Resource(beanName = "testBean") private BeanTest testBean; @Resource(beanName = "methodIsBeanName") private BeanTest testBean1; @Override public void handle() { printService.print(); System.out.println("AAA BeanTest :" + testBean.getText()); System.out.println("AAA BeanTest1 :" + testBean1.getText()); System.out.println("AAA TestService.handle."); } @Override public void execute() { System.out.println("AAA TestService.execute."); }}Cache Support

@Componentpublic class DemoProviderImpl extends AbstractCacheAble<Integer, Demo> { @Override protected Integer getKey(Demo demo) { return demo.getId(); } @Override protected List<Demo> loadData() { //load Demo data from remote server or database ArrayList<Demo> list = new ArrayList<>(); list.add(new Demo(1, "aaa")); list.add(new Demo(2, "bbb")); return list; }}Http Handler Support

@Handler("/api/login")public class HttpLoginHandler extends BaseHandler { @Override protected Object getMethodParamObjectByType(Class<?> type) { if(type == LoginData.class){ String username = (String) getMethodParamObject("username"); String password = (String) getMethodParamObject("password"); return new LoginData(username,password); } return super.getMethodParamObjectByType(type); } @Override protected Object getMethodParamObject(String value) { // get value from request. // demo request.getParameter(value); return null; } @CheckMethod protected String check(@MethodParam("username") String username) { if (StringUtil.isEmpty(username) || username.trim().length() < 4) { throws new RuntimeException("用户名不能为空"); } return null; } @Resource private LoginService loginService; //you can use @MethodParam Annotation to get parameter /*@HandleMethod public void handle(@MethodParam("username") String username, @MethodParam("password") String password) { loginService.login(username, password); }*/ //you can get DataModel in Method Param , register in (Object getMethodParamObjectByType(Class<?> type)) @HandleMethod public void handle(LoginData data) { loginService.login(data.getUsername(), data.getPassword()); }}Repository Annotation Support

@Repository like @Service Annotation for the Component.