牛小刚的Spring自学笔记之IOC,DI
1.啥是IOC,DI
IOC就是控制反转,将类的创建啥的控制权交给IOC容器,不用你new ,IOC容器给你new。你需要啥对象直接从IOC容器中拿就可以了。就是高级的工厂模式。不懂的去看下简单工厂模式
DI就是依赖注入,把属性,类以配置文件的形式让IOC容器去根据配置文件来进行实例化并赋值
IOC(控制反转)也可以称之为DI(依赖注入)
控制反转:将创建对象、属性值的控制权转交给IOC,从手动new变为从IOC容器中getBean()。
依赖注入:将属性值注入类的属性,然后将类的属性注入类(Bean),再将类(Bean)注入IOC容器。
正常开发程序怎么来,都知道吧
- 这是个Student类和他的实例化过程
class Student{
String name;
int age;
//get set 省略
//方法省略
}
public class Main{
public static void main(String ags[]){
Student student = new Student();
student.***
}
}
-
而IOC方式是这样滴,还是以Student类为例
先建立applicationContext.xml 他是定义Bean配置框架的核心Xml文件,它可以通过DI的方式进行注入student(Bean)
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- id值及为对象名(唯一标识名) class值是类的限定名,写错了就没法注入了-->
<bean id="student" class="com.test.spring.Sudent">
<property name = "name" value = "那个男人"/> <!--name值就是类中的属性名 value顾名思义对其赋的值-->
<property name = "age" value = "25"/>
</bean>
</beans>
public class Main{
public static void main(String ags[]){
//直接生成applicationContext对象从容器中取出对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//getBean返回值是Object类型,需要强转下
Student student = (Student)applicationContext.getBean("student");
student.***
}
}
- DI有三种方式进行注入分别是
- 1.setter方法注入
通过类提供的setXX()进行注入,而且此时类中必须要有一个无参的构造方法,要不然会报错
看个例子吧
class Student{
String name;
int age;
public void setAge(int age){
this.age=age;
}
public void setName(String name){
this.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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- id值及为对象名(唯一标识名) class值是类的限定名,写错了就没法注入了-->
<bean id="student" class="com.test.spring.Sudent">
<property name = "name" value = "那个男人"/> <!--name值就是类中的属性名 value顾名思义对其赋的值-->
<property name = "age" value = "25"/>
</bean>
</beans>
- 2.构造器注入
必须提供构造方法
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- id值及为对象名(唯一标识名) class值是类的限定名,写错了就没法注入了-->
<bean id="student" class="com.test.spring.Sudent">
<!--index代表的是下标值位置的属性值 name value的意义与上面一致-->
<constructor-arg index ="0" name="name" value="Murphy"></constructor-arg>
</bean>
</beans>
- 3.基于注解的注入
@Autowired(自动注入)修饰符有三个属性:Constructor,byType,byName。默认按照byType注入。
constructor:通过构造方法进行自动注入,spring会匹配与构造方法参数类型一致的bean进行注入,如果有一个多参数的构造方法,一个只有一个参数的构造方法,在容器中查找到多个匹配多参数构造方法的bean,那么spring会优先将bean注入到多参数的构造方法中。
byName:被注入bean的id名必须与set方法后半截匹配,并且id名称的第一个单词首字母必须小写,这一点与手动set注入有点不同。
byType:查找所有的set方法,将符合符合参数类型的bean注入。
主要有四种注解可以注册bean,每种注解可以任意使用,只是语义上有所差异:
@Component:可以用于注册所有bean
@Repository:主要用于注册dao层的bean
@Controller:主要用于注册控制层的bean
@Service:主要用于注册服务层的bean