IOC容器
IOC(Inverse of Control: 反转控制)是一种设计思想
理解ioc控制反转
传统的创建与依赖查找是在你对象内部直接实现与控制,而实现ioc意味 将原本在程序中手动创建对象的控制权,交由Spring框架 - ioc容器来管理,这样对象的控制权实现反转且降低了程序的耦合性,程序员无需再关心对象的创建,只需关注业务的本身。ioc容器是Spring用来实现ioc的载体,ioc容器实际上就是一个Map(Key,Value),Map中存放各种对象*
ioc作用是什么?
在Java开发中,传统开发是由我们在类内部主动创建对象,不仅会使类与类之间耦合,而且客户为增加新方法属性等时,在原码直接修改也是强烈不建议的
而有了ioc容器后,注入创建和查找依赖对象的控制权就交给了ioc容器,是对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。
实现方式
1,使用无参构造创建对象,默认!
public class User {
private String Name;
public User() {
System.out.println("使用无参构造,实现了name的注入");
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public void show(){
System.out.println("Name= "+Name);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="Com.gl.pojo.User">
<property name="name" value="gl"/>
</bean>
</beans>
public class Mytext01 {
public static void main(String[] args) {
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationcontext.xml");
User user = cpx.getBean("user", User.class);
user.show();
/* 控制台结果:
使用无参构造,实现了name的注入
Name= gl
*/
}
}
二,使用构造器注入
1,通过 ---下标索引赋值
public class User {
private String Name;
private String Sex;
---------------------0-----------1------------------
public User(String name, String sex) {
Name = name;
Sex = sex;
}
--------------------------------------------------
public void show() {
System.out.println("Name= " + Name);
} }
<bean id="user" class="User"> <!--下标索引赋值--> <constructor-arg index="0" value="gl_1"/> <constructor-arg index="1" value="男"/> </bean>
public class Mytext01 {
public static void main(String[] args) {
ClassPathXmlApplicationContext cpx = new ClassPathXmlApplicationContext("applicationcontext.xml");
User user = cpx.getBean("user", User.class);
user.show();
} }
2,通过---参数类型赋值(不建议)
public class User {
private String Name;
private int Age;
public User(String name, int age) {
Name = name;
Age = age;
}
public void show() {
System.out.println("Name= " + Name);
System.out.println("Age= " + Age);
}
}
<bean id="user" class="User"> <!--类型赋值--> <constructor-arg type="java.lang.String" value="gl-1"/> <constructor-arg type="int" value="1"/> </bean>
3,通过---参数名进行赋值
public class User {
private String Name;
private int Age;
public User(String name, int age) {
Name = name;
Age = age;
}
public void show() {
System.out.println("Name= " + Name);
System.out.println("Age= " + Age);
}
<!--通过参数名进行赋值--> <bean class="User" id="user"> <constructor-arg name="name" value="gl"/> <constructor-arg name="age" value="1"/> </bean>