XML管理全套——环境准备
maven:
<!--【Spring util级别的代码封装】,asm、cligb的一些实现在这儿,还有各种处理注解与反射的工具类-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
<!--【Spring bean级别的代码jar包】,基本的IoC/DI的实现,包含访问配置文件、创建和管理bean -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
<!--【Spring 容器级别的代码jar包】,主要在整个容器层面考虑扩展性以及容器的生命周期等等-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
<!--【Spring 一些应用的扩展jar包】,比如Cache(ehcache)、JCA、JMX、 邮件服务(Java Mail、COS Mail)、任务计划Scheduling(Timer、Quartz)方面的类-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
<!--【Spring SPEL表达式的支持】-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.0.0.RELEASE</version>
</dependency>
创建ioc.xml文件
文件模板:
<?xml version="1.0" encoding="UTF-8"?>
<!--beans里配置约束文件,用于提示代码,这里是最完整的-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<bean>
</bean>
</beans>
程序入口
public class test01 {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("bean-ioc.xml");
}
}
XML管理全套——创建对象
创建普通对象:
都是在创建对象,只是创建方式不一样
如果我要演示就会像视频那样变成几个小时
【1】类构造创建(直接用反射调用无参构造器):
<bean id="HelloService" class="ioc_01.HelloService"></bean>
public class HelloWorld {
public HelloWorld(){
}
}
【2】类静态方法(调用类中factory-method为方法名的静态方法的的返回值作为对象):
<bean id="d2" class="java.util.Calendar" factory-method="getInstance"</bean>
【3】类依赖(调用容器中另外一个对象的factory-method为方法名的方法的返回值作为对象):
<bean id="d3" factory-bean="d2" factory-method="getTime"></bean>=>
【4】有参构造创建(默认调用无参,指定后将根据你的参数列表调用构造器,index是参数列表的位置,如果参数
是值就是value,是容器的某个对象就用ref)
<bean>
<constructor-arg index="0" value="" ></constructor-arg>
<constructor-arg index="1" ref=""></constructor-arg>
</bean>
创建文件对象:
<!--将文件加载成为一个properties对象,要用#获取到对象后才能访问-->
<util:properties id="dbConfig" location="classpath:jdbc.properties" />
<bean id="jdbcConfig2" class="ioc_01.JdbcConfig">
<property name="username" value="#{dbConfig['jdbc.username']}"></property>
<property name="password" value="#{dbConfig['jdbc.password']}"></property>
</bean>
<!--将文件加载成为全局参数,所以用$可以直接访问-->
<context:property-placeholder location="classpath:/jdbc.properties" />
<bean id="jdbcConfig" class="ioc_01.JdbcConfig">
<property name="password" value="${jdbc.password}"></property>
<property name="username" value="${jdbc.password}"></property>
</bean>
文件对象演示:
(1)创建properties文件
这种文件类型的特点就是,轻松实现k-v,比如username对应GodSchool这种描述形式;
(2)创建引用该文件值的对象
public class JdbcConfig {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(3)建立xml描述
<?xml version="1.0" encoding="UTF-8"?>
<!--beans里配置约束文件,用于提示代码,这里是最完整的-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!--将文件加载成为一个properties对象,要用#获取到对象后才能访问-->
<util:properties id="dbConfig" location="classpath:jdbc.properties" />
<bean id="jdbcConfig2" class="ioc_01.JdbcConfig">
<property name="username" value="#{dbConfig['jdbc.username']}"></property>
<property name="password" value="#{dbConfig['jdbc.password']}"></property>
</bean>
<!--将文件加载成为全局参数,所以用$可以直接访问-->
<context:property-placeholder location="classpath:/jdbc.properties" />
<bean id="jdbcConfig" class="ioc_01.JdbcConfig">
<property name="password" value="${jdbc.password}"></property>
<property name="username" value="${jdbc.password}"></property>
</bean>
</beans>
(4)测试
public class test01 {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("bean-ioc.xml");
JdbcConfig jdbcConfig = ac.getBean("jdbcConfig", JdbcConfig.class);
JdbcConfig jdbcConfig2 = ac.getBean("jdbcConfig2", JdbcConfig.class);
Properties properties = ac.getBean("dbConfig", Properties.class);
}
}
(5)结果
XML管理全套——标签属性
<bean id="" map中的key!
class="" 类实例包
scope="prototype/singleton" 多例-线程独立会创建多个、单例-多线程共享;默认单例
lazy-init="true/false" 懒加载模式,用到这个对时才创建
init-method="init" 初始化时调用的方法名
destroy-method="destory" 销毁时调用的方法名
>
</bean>
XML管理全套——属性赋值
【赋值基本数据类型】——如果你的属性是级别类型可以直接赋值
<bean class="com.tedu.cn.Entity.User">
<property name="username" value="luozhifeng"></property>
<property name="password" value="123456"></property>
</bean>
【赋值简单数据结构】——如果你的属性是map或者list结构
<bean class="entity">
<property name="session">
<map>
<entry key="lzf" value="12341234"></entry>
</map>
</property>
<property name="names">
<list>
<value>fuck1</value>
<value>fuck2</value>
<value>fuck3</value>
<value>fuck4</value>
</list>
</property>
</bean>
【赋值文件对象属性】——如果你的属性是properties文件对象类型
<property name="properties">
<props>
……
<prop key="username">root</prop>
<prop key="password">1234</prop>
</props>
</property>
XML管理全套——引用注入
【引用整个对象】
<bean class="com.tedu.cn.Entity.User">
<property name="Childrenlist" ref="Children"></property>
</bean>
【引用对象的值】——#作为运算符,拿到容器的某个对象后取他的值
<bean id="k2" class="Spring.Student">
<property name="name" value="#{k1.list[1]}"></property>
</bean>
XML管理全套——自动装配
autowire=“byName”:很显然,有的时候属性名就是id名,按照这个规范来就可以自动根据属性名作为id装配,不用手动写好关系;
autowire=“byType”:很显然,有的时候属性的类型在容器仅有一个,按照这个规范来就可以自动根据类型装配;
ID名匹配(规范id就是参数名)
public class HelloController {
private HelloService helloService;//用属性名作为id
……
}
<bean id="helloController" class="ioc_01.HelloController" autowire="byName"></bean>
<bean id="helloService" class="ioc_01.HelloService"></bean>//在这里一定要配成一致的
类型匹配(扫描整个项目文件)
<bean id="stu" class="Spring.Student" autowire="byType"/>
Ps:利用自动装配则无需要去手动建立bean注入的关联,只需要配置好各自的ID以及属性名的规范即可,此处不做过多的代码显示;避免影响笔记的间接性
XML管理全套——扫包创建
很显然我们不希望一个个这样映射对象,直接给包名全部创建不是更改,必须加了特定注解+扫包才能将类的对象放在容器内,基于注解下一章演示;
<context:component-scan base-package="ioc_01"></context:component-scan>
ioc_01个包名
后续Spring专题:
SpringIOC——注解管理全套
SpringIOC——内部工具全套
SpringIOC——核心源码剖析
GodSchool
致力于简洁的知识工程,输出高质量的知识产出,我们一起努力