21.05.08
文章目录
引用类型的自动注入(通过配置文件)
spring框架根据某些规则可以给引用类型赋值,不用我们在给引用类型赋值。
使用的规则常用的是byName,byType
byName(按名称注入)
byName(按名称注入):
Java类中引用类型的属性名和Spring容器中的配置文件< bean >的id名称一样, 且数据类型是一致的,这样容器中的bean,Spring会自动给引用类型赋值
语法: <bean id="xx" class="yyy" autowire="byName">
<bean id="myStudent" class="com.node.ba04.Student" autowire="byName">
例:
xml
<?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">
<!--byName-->
<bean id="myStudent" class="com.node.ba04.Student" autowire="byName">
<property name="name" value="李四"/>
<property name="age" value="20"/>
<!--引用类型-->
<!--<property name="school" ref="mySchool"/>-->
</bean>
<!--声明School对象-->
<bean id="school" class="com.node.ba04.School">
<property name="name" value="清华大学"/>
<property name="address" value="北京海淀区"/>
</bean>
</beans>
测试代码
package com.node;
import com.node.ba04.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest04 {
@Test
public void test01(){
String config="ba04/applicationContext.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(config);
Student mystudent= (Student) ac.getBean("myStudent");
System.out.println("Student对象"+mystudent);
}
}
byType(按类型注入)
Java类中的引用类型的数据类型和Spring容器中(配置文件)的class是同源的关系,这样才可以赋值给引用类型
同源就是一类的意思:
-
java类中的引用类型的数据类型和bean的class的值是一样的
-
java类中的引用类型的数据类型和bean的class的值是父子关系的
-
java类中的引用类型的数据类型和bean的class的值是接口和实现类关系
注意:在byType中,在xml配置文件中声明bean只能有1个符合同源条件的,多余一个是错误的
语法:<bean id="xx" class="yyy" autowire="byType">
<bean id="myStudent" class="com.node.ba05.Student" autowire="byType">
例:
xml
<?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">
<!--byType-->
<bean id="myStudent" class="com.node.ba05.Student" autowire="byType">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
<!--声明School对象-->
<!--<bean id="mySchool" class="com.node.ba05.School">
<property name="name" value="山东理工大学"/>
<property name="address" value="山东淄博"/>
</bean>-->
<!--声明PrimarySchool对象-->
<bean id="mySchool" class="com.node.ba05.PrimarySchool">
<property name="name" value="山东大学"/>
<property name="address" value="山东济南"/>
</bean>
</beans>
测试代码
package com.node;
import com.node.ba05.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest05 {
@Test
public void test01(){
String config="ba05/applicationContext.xml";
ApplicationContext ac=new ClassPathXmlApplicationContext(config);
Student mystudent= (Student) ac.getBean("myStudent");
System.out.println("Student对象"+mystudent);
}
}
多个配置文件的优势
1每个文件的大小比一个文件要小跟多,效率高
2.避免多人竞争带来的冲突
如果项目由多个模块(相关功能在一起),一个模块一个配置文件
多个配置文件的分配方式
1.按功能模块:一个模块一个配置文件
2.按类的功能:数据库相关的配置一个配置文件,做事务功能的一个配置文件,做service功能的一个配置文件
例:
total.xml表示主配置文件:包含其他的配置文件,主配置文件一般不是定义对象的
total表示主配置文件,加载的是文件列表,不能加载自己
语法:
<import resource="其他配置文件的路径" />
<import resource="classpath:ba06/spring-school.xml" />
<import resource="classpath:ba06/spring-student.xml" />`
在包含关系的配置文件中 可以使用通配符(* : 表示任意字符)
注意 : 主的配日志文件名称不能包含在通配符范围内 否则会造成死循环
文件需要在一级目录下才能使用通配符
例:
xml
<?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">
<!--spring-total表示主配置文件-->
<!--加载的是文件列表,不能加载自己-->
<!--<import resource="classpath:ba06/spring-school.xml" />
<import resource="classpath:ba06/spring-student.xml" />-->
<!--在包含关系的配置文件中 可以使用通配符(* : 表示任意字符)-->
<!--注意 : 主的配日志文件名称不能包含在通配符范围内 否则会造成死循环
文件需要在一级目录下才能使用通配符
-->
<import resource="classpath:ba06/spring-*.xml" />
</beans>
基于di的注解
通过完成java对象创建,实行赋值
使用注解的步骤
1.加入maven的依赖 spring-context。在你加入spring-context的同时,间接加入spring-aop的依赖。
使用注解必须使用spring-aop依赖
2.在类中加入spring的注解(多个不同功能的注解)
3.在spring的配置文件中,加入一个组件扫描器的标签,说明注解在你的项目中的位置
@Component
创建对象的,等同于的功能
属性:value 就是对象的名称,也就是bean的id值
value的值是唯一的,创建的对象在则会那个spring容器就一个
value 可省略 @Component(“myStudent”)
可不指定对象名称,由spring提供默认名称:类名的首字母小写 @Component(“student”)
位置:在类的上面
@Component(value=“myStudent”)等同于<bean id="myStudent" class="com.node.ba05.Student" ">
声明组件扫描器
base-package : 指定注解在你的项目中的包名
component-scan工作方式:spring会扫描遍历base-package指定的包,把包中和子包中的所有类,找到类中的注解,按照注解的功能创建对象,活给属性赋值
加入component-scan标签,配置文件的变化:
1.加入一个性的约束文件spring-context.xsd
2.个这个性的约束文件器个命名空间的名称
<context:component-scan base-package="com.node.ba01"/>
spring中和@Component功能一致,创建对象的注解还有:
指定多个包的三种方式
第一种方式:使用多次组件扫描器,指定不同的包
<context:component-scan base-package="com.node.ba01"/>
<context:component-scan base-package="com.node.ba02"/>
第二种方式:使用分割符(;或,)分隔多个包名
<context:component-scan base-package="com.node.ba01;com.node.ba02"/>
第三种方式:指定父包
<context:component-scan base-package="com.node"/>