牛小刚的Spring自学笔记之IOC

牛小刚的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值