hdml指的是什么接口
313
2023-03-03
浅谈spring ioc的注入方式及注入不同的数据类型
关于Spring-IoC的简单使用参考:
spring ioc的简单实例及bean的作用域属性解析
1、通过set方法注入不同数据类型
测试类代码(set方式注入的属性一定要加set方法)
/**通过set方法注入示例*/
public class IoC_By_Set {
/**注入Integer类型参数*/
private Integer id;
/**注入String类型参数*/
private String name;
/**注入实体Bean*/
private User user;
/**注入数组*/
private Object[] array;
/**注入List集合*/
private List
/**注入Set集合*/
private Set
/**注入Map键值对*/
private Map
/**注入properties类型*/
private Properties properties;
/**注入空字符串*/
private String emptyValue;
/**注入null值*/
private String nullValue = "";
/**检测注入的属性是否全部正确*/
public Boolean checkAttr() {
if(id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("--------------------------");
if(name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("--------------------------");
if(user == null) {
return false;
} else {
System.out.println("Bean:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("--------------------------");
if(array == null) {
return false;
} else {
System.out.println("array:");
for (Object object : array) {
System.out.println(object.toString());
}
}
System.out.println("--------------------------");
if(list == null) {
return false;
} else {
System.out.println("list:");
for (Object object : list) {
System.out.println(object.toString());
}
}
System.out.println("--------------------------");
if(set == null) {
return false;
} else {
System.out.println("set:");
for (Object object : set) {
System.out.println(object.toString());
}
}
System.out.println("--------------------------");
if(map == null) {
return false;
} else {
Set
System.out.println("map:");
for (Entry
System.out.println(entry.getKey() + "|" + entry.getValue());
}
}
System.out.println("--------------------------");
if(properties == null) {
return false;
} else {
Set
System.out.println("properties:");
for (Entry
System.out.println(entry.getKey() + "|" + entry.getValue());
}
}
System.out.println("--------------------------");
if(!"".equals(emptyValue))
return false;
System.out.println("--------------------------");
if(!(null == nullValue))
return false;
System.out.println("--------------------------");
System.out.println("全部正确!!!");
return true;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setUser(User user) {
this.user = user;
}
public void setArray(Object[] array) {
this.array = array;
}
public void setList(List
this.list = list;
}
public void setSet(Set
this.set = set;
}
public void setMap(Map
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setEmptyValue(String emptyValue) {
this.emptyValue = emptyValue;
}
public void setNullValue(String nullValue) {
this.nullValue = nullValue;
}
}
applicationContext.xml配置
<value>list01
测试代码
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//读取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void SetTest() {
IoC_By_Set ioc = (IoC_By_Set) ctx.getBean("ioC_By_Set");
ioc.checkAttr();
}
}
控制台结果:
id:1
--------------------------
name:P&G
--------------------------
Bean:1|内部Bean|233
--------------------------
array:
array01
array02
array03
--------------------------
list:
list01
list02
list03
--------------------------
set:
set01
set02
set03
--------------------------
map:
mapKey01|mapValue01
mapKey02|mapValue02
--------------------------
properties:
propKey2|propValue2
propKey1|propValue1
--------------------------
--------------------------
--------------------------
全部正确!!!
2、通过构造方法注入各种类型属性
注意:使用JDK1.8版本请将spring相关jar包升级到4.x版本以上,否则不兼容构造方法注入
测试类代码
/** 通过构造方法注入示例 */
public class IoC_By_Constructor {
private Integer id;
private String name;
private User user;
private List
public IoC_By_Constructor() {
}
public IoC_By_Constructor(Integer id, String name, User user,
List
this.id = id;
this.name = name;
this.user = user;
this.list = list;
}
/**检查是否注入成功*/
public Boolean checkAttr() {
if(id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("----------------------------");
if(name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("----------------------------");
if(user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("----------------------------");
if(list == null) {
return false;
} else {
System.out.println("list:");
for (Object object : list) {
System.out.println(object.toString());
}
}
System.out.println("----------------------------");
System.out.println("全部正确!!!");
return true;
}
}
applicationContext.xml配置
测试代码:
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//读取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void constructorTest() {
IoC_By_Constructor ioc = (IoC_By_Constructor) ctx.getBean("ioC_By_Constructor");
ioc.checkAttr();
}
}
控制台结果:
id:1
----------------------------
name:P&G
----------------------------
user:1|构造内部Bean|666
----------------------------
list:
list01
list02
list03
----------------------------
全部正确!!!
3、自动注入(自动装配)
自动装配虽然能节省一些代码但是不推荐使用
测试类代码:
/**自动装配注入*/
public class IoC_By_Auto {
private User user;
/**检查是否注入成功*/
public Boolean checkAttr() {
if(user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("正确!!!");
return true;
}
/**自动装配的属性需要设置set方法*/
public void setUser(User user) {
this.user = user;
}
}
applicationContext.xml配置
测试代码
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//读取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void AutoTest() {
IoC_By_Auto ioc = (IoC_By_Auto) ctx.getBean("ioC_By_Auto");
ioc.checkAttr();
}
}
控制台结果
user:1|自动装配|233
正确!!!
以上使用的是byName模式,其他模式配置代码已经注明,不做测试。
4、使用P命名空间注入属性
测试类代码
/**使用P命名空间注入*/
public class IoC_By_P {
private Integer id;
private String name;
private User user;
/**检查是否注入成功*/
public Boolean checkAttr() {
if(id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("----------------------------");
if(name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("----------------------------");
if(user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("----------------------------");
System.out.println("全部正确!!!");
return true;
}
//使用P命名空间注入属性需要设置set方法
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setUser(User user) {
this.user = user;
}
}
applicationContext.xml配置
p:name="命名空间" p:user-ref="user2">
p:name="命名空间" p:user-ref="user2">
测试代码
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//读取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void PTest() {
IoC_By_P ioc = (IoC_By_P) ctx.getBean("ioC_By_P");
ioc.checkAttr();
}
}
控制台结果
id:1
----------------------------
name:命名空间
----------------------------
user:1|P|233
----------------------------
全部正确!!!
5、使用注解方式注入
Spring在3.0以后,提供了基于Annotation(注解)的注入。
1.@Autowired-对成员变量、方法和构造函数进行标注,来完成自动装配的工作,不推荐使用
2.@Qualifier-配合@Autowired来解决装配多个同类型的bean
3.@Resource-jsR-250标准注解,作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入
4.@PostConstruct-在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行
5.@PreDestroy-在方法上加上注解@PreDestroy,这个方法就会在Bean初始化之后被Spring容器执行
6.@Component-只需要在对应的类上加上一个@Component注解,就将该类定义为一个Bean,不推荐使用,推荐使用更加细化的三种:@Repository、@Service、@Controller
@Repository存储层Bean
@Service业务层Bean
@Controller展示层Bean
7.@Scope-定义Bean的作用范围
首先配置applicationContext.xml开启注解
实体Bean加注解
@Repository
public class User {
private Integer id = 1;
private String userName = "注解注入";
private String passWord = "233";
public User() {
super();
}
public User(Integer id, String userName, String passWord) {
super();
this.id = id;
this.userName = userName;
this.passWord = passWord;
}
public Integer getId() {
return id;
}
public String getUserName() {
return userName;
}
public String getPassWord() {
return passWord;
}
public void setId(Integer id) {
this.id = id;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
测试类代码加注解
/**使用注解注入属性*/
@Service("ioC_By_Annotation")
public class IoC_By_Annotation {
@Resource
private User user;
public void setUser(User user) {
this.user = user;
}
/**检查是否注入成功*/
public Boolean checkAttr() {
if(user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("正确!!!");
return true;
}
}
测试代码
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//读取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void annotationTest() {
IoC_By_Annotation ioc = (IoC_By_Annotation) ctx.getBean("ioC_By_Annotation");
ioc.checkAttr();
}
}
控制台输出
经测试使用注解注入如果applicationContext.xml配置有其他注入方式会报错,也会导致其他注入方式异常。
user:1|注解注入|233
正确!!!
6、通过配置静态工厂方法Bean注入
静态工厂代码
/**静态工厂*/
public class StaticFactory {
public static Integer getId() {
return 1;
}
public static String getName() {
return "静态工厂";
}
public static User getUser() {
return new User(1, "工厂User", "666");
}
}
测试类代码
/** 通过静态工厂方式注入 */
public class IoC_By_StaticFactory {
private Integer id;
private String name;
private User user;
/** 检查是否注入成功 */
public Boolean checkAttr() {
if (id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("----------------------------");
if (name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("----------------------------");
if (user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|"
+ user.getUserName() + "|" + user.getPassWord());
}
System.out.println("----------------------------");
System.out.println("全部正确!!!");
return true;
}
/**需要为需要注入的属性设置set方法*/
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setUser(User user) {
this.user = user;
}
}
applicationContext.xml配置
测试代码
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//读取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void staticFactoryTest() {
IoC_By_StaticFactory ioc = (IoC_By_StaticFactory) ctx.getBean("ioC_By_StaticFactory");
ioc.checkAttr();
}
}
控制台输出结果
id:1
----------------------------
name:静态工厂
----------------------------
user:1|工厂User|666
----------------------------
全部正确!!!
7、通过实例工厂方法注入
与静态工厂区别在于实例工厂不是静态的,需要先new 一个实例工厂对象,才可以配置其方法,而new 的这个对象也由spring来管理
工厂代码
/**实例工厂*/
public class Factory {
public Integer getId() {
return 1;
}
public String getName() {
return "实例工厂";
}
public User getUser() {
return new User(1, "实例工厂User", "233");
}
}
测试类代码
/**实例工厂注入*/
public class IoC_By_Factory {
private Integer id;
private String name;
private User user;
/** 检查是否注入成功 */
public Boolean checkAttr() {
if (id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("----------------------------");
if (name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("----------------------------");
if (user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|"
+ user.getUserName() + "|" + user.getPassWord());
}
System.out.println("----------------------------");
System.out.println("全部正确!!!");
return true;
http://}
/**需要为需要注入的属性设置set方法*/
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setUser(User user) {
this.user = user;
}
}
applicationContext.xml配置
测试类代码
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//读取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void factoryTest() {
IoC_By_Factory ioc = (IoC_By_Factory) ctx.getBean("ioC_By_Factory");
ioc.checkAttr();
}
}
控制台输出
id:1
----------------------------
name:实例工厂
----------------------------
user:1|实例工厂User|233
----------------------------
全部正确!!!
总结
以上就是本文关于浅谈spring ioc的注入方式及注入不同的数据类型的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~