1. spring简介
Spring是一个分层的JavaSE/EE full-stack(一站式)轻量级开源框架。
2.spring的模块
3.Spring控制反转(IOC)
需求调用一个类中的方法,比如创建一个Helloworld类,调用Helloworld中的sayHello方法
3.1 传统的方式
首先创建一个HelloWorld类
public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public void sayHello() { System.out.println("hello:"+name); } }
然后创建Main类测试
public class Main { public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("tom"); helloWorld.sayHello(); } }
分析:由于Main类需要调用Helloworld类中的sayHello方法,所以需要在Main方法中创建Helloworld类对象,然后改用该方法,如果Helloworld类中sayHello方法的参数改变,需要修改Helloworld类中的方法,而且需要修改Main类中调用的地方,类与类之间的耦合度过高。
Spring的方式
首先还是创建Helloworld类
public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public void sayHello() { System.out.println("hello:"+name); } }
创建spring.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 "> <bean id = "helloWorld" class="spring.springday1.Demo2.HelloWorld"> <property name="name" value="kongshuai"/> </bean> </beans>
创建调用类Main
public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring/springday1/Demo2/springdemo2.xml"); HelloWorld helloWorld = (HelloWorld) classPathXmlApplicationContext.getBean("helloWorld"); helloWorld.sayHello(); } }
分析:spring方式通过spring容器(spring配置文件)将类交付给spring容器进行管理,当需要调用该类时,需要创建spring容器对象,通过该对象获取调用类。该种方式降低了类与类之间的耦合度,如果Helloworld的sayHello方法发生变化,不需要修改Main类,只修改Helloword中的方法即可。
有个问题需要注意:
如果Helloworld获中没有默认的构造方法,在实例化Helloworld对象时会报错。
总结:控制反转主要体现在调用类中的方方法时不再需要在调用类中实例化该类对象,通过Spring容器的对象获取类的实例,调用方法。举个简单的例子:A是厨师,B是材料,厨师需要使用材料,然后自己去拿材料,如果材料改变了,厨师要再去拿材料,厨师说不干了,太累了。于是C诞生了,C专门管理材料,厨师说我要小黄瓜,C把小黄瓜给了A,厨师说我要大黄瓜,C把大黄瓜给了A,厨师说我要大的扁的黄瓜,C把大的扁的黄瓜给了A。个人见解:spring容器相当于代理,为调用类管理被调用类的实例。
(未完待续)
4. 依赖注入
(1)setter注入:如果注入的数据包含特殊字符使用<![CDATA[<Modu^>]]>
(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 "> <bean id="car" class="spring.springday2.Demo2.Car"> <constructor-arg value="W" type = "java.lang.String"/> <!--特殊字符处理--> <constructor-arg> <value><![CDATA[<Modu^>]]></value> </constructor-arg> <constructor-arg value="1" type = "int"/> </bean> <bean id="car1" class="spring.springday2.Demo2.Car"> <constructor-arg value="W" type = "java.lang.String"/> <constructor-arg value="MoDu" type = "java.lang.String"/> <constructor-arg value="1" type="double"/> </bean> <bean id="person" class="spring.springday2.Demo2.Person"> <constructor-arg name="name" value="kongshuai"/> <constructor-arg name ="age" value="12"/> <!--<constructor-arg name ="car" ref ="car"/>--> <!--<!–<constructor-arg><null/></constructor-arg>–>--> <!--<property name="car.brand" value="kongshuai"/>-->
<!--<property name="car.brand" value="kongshuai"/>-->
<constructor-arg name="car"><bean class ="spring.springday2.Demo2.Car" > <property name ="brand" value ="hahah" ></property> <property name ="corp" value ="dashanghai" ></property> <property name ="price" value ="20" ></property> </bean> </constructor-arg> </bean> <bean id ="person1" class ="spring.springday2.Demo2.Person" > <property name ="name" value ="kongshuai" ></property> <property name ="age" value ="12" ></property> <property name ="list" > <list> <ref bean ="car" ></ref> <ref bean ="car1" ></ref> </list> </property> </bean> <bean id ="person2" class ="spring.springday2.Demo2.Person1" > <property name ="name" value ="kongshuai" ></property> <property name ="age" value ="12" ></property> <property name ="map" > <map> <entry key ="AA" value-ref ="car" ></entry> <entry key ="BB" value-ref ="car1" ></entry> </map> </property> </bean> </beans>