anspring安卓平台仿spring
框架简介:
spring框架给J2EE开发者带来了诸多便利,尤其是经典的ioc和aop带来的对象设计以及扩展的极大便捷。
但是安卓平台始终缺失这一利器,然而官方android-spring的发布,居然发现和J2EE的spring大相径庭。
无奈之下,作者只能模仿J2EE版spring的功能,写了一个轻量的anspring。
设计原则:
力求和官方spring用法保持一致。
使用简洁。
核心spring:
实现了ioc的基本功能,包括 @AutoWired @Scope @Component @Qualifier @PostConstruct @PreDestroy
暂时未实现applicationContext.xml,
使用@Configuration,以标注的形式实现配置,包含@ConponentScan @Import @PropertySource @Value @Bean
由于android对cglib的不支持(也许认识有误),aop没有实现。只实现了不完善的 @Transaction
外围工具集:
一个轻量级 Logx框架,去掉了讨厌的tag,直接Logx.d(...),tag自动生成(类名-方法名-行数), 并支持单个日志文件/日期划分日志文件/体积划分日志文件
ActivityInject/SystemInject 对R.id 和按钮事件 等的注入,下个版本拟支持自定义解析器
AndroidUtils 简化alert()等android相关常用操作
详细用法:
https://github.com/liujingjing5/anspring/wiki/%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3
列子代码:
public class MainActivity extends Activity{
@R_Id(R.id.button1) //注入按钮id
Button btn2;
@Autowired //以名称注入bean
@Qualifier("manServiceImp1")
ManService manService;
@Autowired //以类型注入bean
AndroidUtils androidUtils;
@Autowired
XiaoMing xm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SpringUtils.load(this,MyConfigure.class); //用MyConfigure的配置,加载spring容器
BeanInjecter.inject(this); //注入this的成员变量(bean对象)
ActivityInjecter.inject(this); //注入this中的成员变量(android特有对象)
Logx.d("加载成功");
}
@Override
protected void onDestroy() {
SpringUtils.unload();
super.onDestroy();
}
@OnClick({R.id.button1,R.id.button2}) //给按钮注册事件
public void onClick(View v) {
androidUtils.alert("消息", xm.getName(), "确定", null);
}
@OnLongClick(R.id.button2)
public boolean onLongClick() {
androidUtils.toast("长按");
return false;
}
@AfterStart(1000) //启动后延时加载
private void afterViewTest(){
androidUtils.toast("延时一秒");
}
}
@Configuration //相当于applicationContext.xml
@PropertySource("assets:test.ini") //读取配置文件
public class MyConfigure implements ConfigurationTemplate {
@Override
@Bean //相当于applicationContext.xml中的<bean></bean>
public DataSource dataSource() {
DataSource dataSource = new DataSource(){
@Override
protected SQLiteDatabase injectSQLiteDatabase() {
SQLiteOpenHelper helper = new SQLiteOpenHelper(SpringUtils.getSpringContext().getContext(), "spring.db", null, 1) {
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
};
SQLiteDatabase db = helper.getWritableDatabase();
return db;
}
};
return dataSource;
}
@Override
@Bean
public SqliteTemplate sqliteTemplate(DataSource dataSource) {
SqliteTemplate template = new SqliteTemplate(dataSource);
return template;
}
@Override
@Bean
public TransactionManager transactionManager(DataSource dataSource) {
TransactionManager tm = new TransactionManager(dataSource);
return tm;
}
@Bean
public AndroidUtils androidUtils(){
return new AndroidUtils(SpringUtils.getSpringContext().getContext());
}
}
@Component //表明这是一个bean
public class XiaoMing {
String name;
@Value("shadiao")
String wahao;
@Value("${rc.xiaoming.age}") //使用配置文件注入
int age;
@Autowired //参数注入的方式
public XiaoMing(@Value("${rc.xiaoming.name}")String name) {
this.name = name;
}
@Override
public String toString() {
return "XiaoMing [name=" + name + ", wahao=" + wahao + ", age=" + age
+ "]";
}
@PostConstruct //spring 加载完毕后执行
public void sayHello(){
Logx.d("hello:",this.toString());
}
@PreDestroy //spring destroy前执行
public void saybye(){
Logx.d("bye:",this.toString());
}
}