目录
1.依赖注入
1.1构造
1.2set注入
2.基于XML的自动装配
2.1根据名称:
2.2根据类型:
2.3根据构造自动注入
3.Spring 文件中 Bean属性
1.依赖注入
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。依赖注入:
- 依赖指的是对象和对象之间的关联关系。
- 注入指的是一种数据传递行为,通过注入行为来让对象和对象产生关系。
依赖注入常见的实现方式包括两种:
- 第一种:set注入
- 第二种:构造注入
1.1构造
核心原理:通过调用构造方法来给属性赋值
- 通过下标
- 可以通过参数名
- 也可以不指定下标和参数名,可以类型自动推断。
<bean id="userDao" class="com.hu.dao.impl.UserDaoImpl"></bean> <bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" >//这里的name 是构造方法上参数的名字 ref 是引用userDao对象<constructor-arg name="userDao" ref="userDao"></constructor-arg></bean>
1.2set注入
通过property标签获取到属性名:userDao
通过属性名推断出set方法名:setUserDao
通过反射机制调用setUserDao()方法给属性赋值
property标签的name是属性名。
property标签的ref是要注入的bean对象的id。(通过ref属性来完成bean的装配,这是bean最简单的一种装配方式。装配指的是:创建系统组件之间关联的动作)
<bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" ><property name="userDao" ref="userDao"></property></bean>
注入基本类型
注入set集合
<property name="phones"><set><!--非简单类型可以使用ref,简单类型使用value--><value>110</value><value>110</value></set></property>
注入List集合
<property name="list"><list><value>铁锤</value><value>张三</value><value>狼</value></list></property>
注入Map集合
<property name="addrs"><map><!--如果key不是简单类型,使用 key-ref 属性--><!--如果value不是简单类型,使用 value-ref 属性--><entry key="2" value="上海浦东区"/><entry key="3" value="深圳宝安区"/></map></property>
注入Properties
<property name="properties"><props><prop key="driver">com.mysql.cj.jdbc.Driver</prop><prop key="url">jdbc:mysql://localhost:3306/spring</prop><prop key="username">root</prop><prop key="password">123456</prop></props></property>
2.基于XML的自动装配
2.1根据名称:
- UserService Bean中需要添加autowire="byName",表示通过名称进行装配。
- UserService类中有一个UserDao属性,而UserDao属性的名字是aaa,对应的set方法是setUserDao(),正好和UserDao Bean的id是一样的。这就是根据名称自动装配。
userDao userDao ; public void setUserDao(userDao userDao) {this.userDao = userDao;}<bean id="userDao" class="com.hu.dao.impl.UserDaoImpl"></bean><bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" autowire="byName" ></bean>
2.2根据类型:
可以看到无论是byName还是byType,在装配的时候都是基于set方法的。所以set方法是必须要提供的。提供构造方法是不行的,
//不能给id 或者给id取名 与set方法中参数名称一致<bean id="userDao" class="com.hu.dao.impl.UserDaoImpl"></bean><bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" autowire="byType" ></bean>
2.3根据构造自动注入
提供构造函数:无需关系引用的id
<bean class="com.hu.dao.impl.UserDaoImpl"></bean><bean id="userServiceo" class="com.hu.Service.impl.userServiceImpl" autowire="constructor" ></bean>
3.Spring 文件中 Bean属性
id: bean在spring容器的唯一标识,spring容器中不可能同时存在两个相同的id。
class: 类的全限定名(类名+包名),用“.”号连接
name: 设置别名,在BeanFactory的getBean(“name”)中可以获取相应的bean。
autowire : byType byName 基于xml自动装配
destroy-method:它的作用是在销毁bean之前可以执行指定的方法。注意:必须满足scope=“singleton”,并且destroy方法参数个数不能超过1,并且参数类型只能为boolean。
init-method:它的作用是在创建一个bean之后调用该方法,初始化方法必须是一个无参方法。
lazy-init: lazy-init 设置只对scop属性为singleton的bean起作用,
lazy-init=”false” 立即加载, 在spring启动时,立刻进行实例.
lazy-init=”true” 延迟加载 ,设置为true的bean将不会在ApplicationContext启动时提前被实例化,而是在第一次向容器通过getBean索取bean时实例化的。
scope
默认(scope="singleton)情况下,Bean对象的创建是在初始化Spring上下文的时候就完成的。
<bean id="user" class="com.hu.pojo.User" scope="singleton">执行这个ApplicationContext 创建对象了 单例ApplicationContext applicationContext =new ClassPathXmlApplicationContext("spring-config.xml");
如果想让Spring的Bean对象以多例的形式存在,可以在bean标签中指定scope属性的值为:prototype,这样Spring会在每一次执行getBean()方法的时候创建Bean对象,调用几次则创建几次。