Auto-Wiring All Beans of Compatible Type
@Autowired 注解按类型(type)依赖入住的时候,可以把类型兼容的所有类注入到数组、链表、map等集合数据结构中。如:mybatis中TypeHandler为例:
package com.doctor.practice01;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public interface TypeHandler<T> {
void setParameter(PreparedStatement ps, int i, T parameter, Object jdbcType) throws SQLException;
T getResult(ResultSet rs, String columnName) throws SQLException;
T getResult(ResultSet rs, int columnIndex) throws SQLException;
T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}
package com.doctor.practice01;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.stereotype.Component;
/**
* @author sdcuike
*
* @time 2016年2月10日 下午9:57:37
*/
@Component("String")
public class StringTypeHandler implements TypeHandler<String> {
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, Object jdbcType) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
package com.doctor.practice01;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import org.springframework.stereotype.Component;
/**
* @author sdcuike
*
* @time 2016年2月10日 下午9:58:23
*/
@Component("Timestamp")
public class SqlTimestampTypeHandler implements TypeHandler<Timestamp> {
@Override
public void setParameter(PreparedStatement ps, int i, Timestamp parameter, Object jdbcType) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public Timestamp getResult(ResultSet rs, String columnName) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Timestamp getResult(ResultSet rs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Timestamp getResult(CallableStatement cs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
}
}
简单例子,我们要把TypeHandler所有的子类,这里指的是StringTypeHandler、SqlTimestampTypeHandler注入到list和map数据结构中:
package com.doctor.practice01;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author sdcuike
*
* @time 2016年2月10日 下午10:00:26
*/
@Component
public class TypeHandlerUtil {
@SuppressWarnings({ "rawtypes", "unused" })
private static List<TypeHandler> typeHandlers;
@SuppressWarnings({ "rawtypes", "unused" })
private static Map<String, TypeHandler> typeHandlerMap;
@Autowired
@SuppressWarnings("rawtypes")
public void setTypeHandlerMap(Map<String, TypeHandler> typeHandlerMap) {
TypeHandlerUtil.typeHandlerMap = typeHandlerMap;
}
@Autowired
@SuppressWarnings("rawtypes")
public void setTypeHandlers(List<TypeHandler> typeHandlers) {
TypeHandlerUtil.typeHandlers = typeHandlers;
}
public static Map<String, TypeHandler> getTypeHandlerMap() {
return typeHandlerMap;
}
public static List<TypeHandler> getTypeHandlers() {
return typeHandlers;
}
}
我们测试一下:
package com.doctor.practice01;
import java.util.List;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
/**
* @author sdcuike
*
* @time 2016年2月10日 下午9:49:16
*
* Auto-Wiring All Beans of Compatible Type
*
*
*/
public class AutoWiringAllBeansOfCompatibleType {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.scan("com.doctor.practice01");
applicationContext.refresh();
TypeHandlerUtil typeHandlerUtil = applicationContext.getBean(TypeHandlerUtil.class);
List<TypeHandler> typeHandlers = typeHandlerUtil.getTypeHandlers();
typeHandlers.forEach(System.out::println);
// com.doctor.practice01.SqlTimestampTypeHandler@7a3d45bd
// com.doctor.practice01.StringTypeHandler@1e7c7811
typeHandlerUtil.getTypeHandlerMap().forEach((k, v) -> System.out.println("k:" + k + " v:" + v));
// k:Timestamp v:com.doctor.practice01.SqlTimestampTypeHandler@7a3d45bd
// k:String v:com.doctor.practice01.StringTypeHandler@1e7c7811
}
}
这样,当我们增加了一个类型的子类的时候,扫描自动注入就带来了便利,而不用我们手动像mybatis一样,配置在一个TypeHandler xml文件中,读取配置的时候再放到一个map结构中,利用spring就带来了便利。