前言(Spring究竟用来干什么?)
我认为Spring之所以被创造出来就是为了让我们能够更加方便在工作中的项目开发,降低项目开发中的大量耦合,使工作的效率更加快速,代码修改起来更加迅速。
在开发中,如果我们我们要给软件增添一个新的功能,而且这个软件已经投入市面使用很长时间了,在spring还没有出现的时候,我们只有一个选择就是去修改软件的源代码,但在spring出现后,就对这项工作提供了大大的便利,我们要添加一个新的功能,只需要通过代理的方式,不修改原来接口进行扩展
要是单纯的从创建对象来与与普通方法进行对比,说实话,我看不出来它方便了多少,相反,我还要花大量时间去学习怎么样使用注解或者使用配置文件,但百因必有果,我们只有学会它最简单的创建对象,注入属性等操作,才可以用它来进行更多高深的操作
如下仅为本人学习笔记,方便以后用到查询,也希望可以对你们有所帮助
IOC
在spring的ioc模块中主要分为两大类,第一大类就是创建对象,另一大类就是注入属性
创建对象
一起来比不同
假设我们现在有这样一个实体类:
public class User { public void add(){ System.out.println("add......"); } }
普通创建的两个对象判断相等情况:
@Test public void test(){ User user1 = new User(); User user2 = new User(); System.out.println(user1==user2); }
运行结果如下:
但如果是spring创建的两个对象来判断:
@Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); User user1 = context.getBean("user",User.class); User user2 = context.getBean("user",User.class); System.out.println(user1==user2); }
运行结果如下:
我们可以看出来,spring创建的两个对象他们结果是相等的,也就是说,他们都两个对象的地址是相等的,可以说他们是取自同一对象,因此我们就可以把ioc想象成一个用来装这些对象的器皿,我们只需要把他放在器皿里面,想用的时候随时拿出来用,不管用了千次万次,我们取的都是同一个东西
xml方式创建对象
我们还是拿这个简单的实体类来讲解:
public class User { public void add(){ System.out.println("add......"); } }
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" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <!-- 配置User对象创建--> <bean id="user" class="com.ioc.spring5.User"></bean> </beans>
第二步 在测试类中测试能否创建对象:
public class TestBean { public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); User user = context.getBean("user",User.class); user.add(); } }
运行结果如下:
对象里面创建对象(注入内部bean和注入外部bean)
我们创建两个实体类和一个接口:
实体类1:
public class UserDaoImpl implements UserDao{ @Override public void update() { System.out.println("dao update......"); } }
实体类1的接口:
public interface UserDao { public void update(); }
实体类2:
public class UserService { //创建UserDao类型属性,生成set方法 private UserDao userDao; public void setUserDao(UserDao userDao){ this.userDao=userDao; } public void add(){ System.out.println("service add ......"); userDao.update(); } }
现在向实体类2注入实体类1属性:
第一步:编写xml配置文件:
注入外部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" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <!--1 service和dao对象创建--> <bean id="userService" class="com.ioc.spring5.service.UserService"> <!--注入userDao对象 name属性值:类里面属性名称 --> <property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="com.ioc.spring5.dao.UserDaoImpl"></bean> </beans>
注入内部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" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <!--1 service和dao对象创建--> <bean id="userService" class="com.ioc.spring5.service.UserService"> <!--注入userDao对象 name属性值:类里面属性名称 --> <property name="userDao"> <bean id="userDaoImpl" class="com.ioc.spring5.dao.UserDaoImpl"></bean> </property> </bean> </beans>
运行结果如下:
分析:我们可以看出在实体类2中我们创建的明明是一个接口对象,但经过配置文件的锁定,它清楚的找到了我们继承实体类1接口的实体类1,并且调用了它的方法
注入属性
xml方式注入属性
注入简单属性
使用set方法进行注入
(1)创建类,定义属性和对应的set方法。
/* * 演示使用set方法进行注入属性 * */ public class Book { //创建属性 private String bname; private String bauthor; private String address; //创建属性对应的set方法 public void setBname(String bname){ this.bname = bname; } public void setBauthor(String bauthor){ this.bauthor = bauthor; } public void setAddress(String address){ this.address = address; } public void testDemo(){ System.out.println(bname+"::"+bauthor+"::"+address); } }
(2)在spring配置文件配置对象创建,配置属性注入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <!--set方法注入属性--> <bean id="book" class="com.ioc.spring5.Book"> <!-- 使用property完成属性注入 name:类里面属性名称 value:向属性注入的值 --> <property name="bname" value="易筋经"></property> <property name="bauthor" value="达摩老祖"> </property> <!--null值--> <!-- <property name="address">--> <!-- <null></null>--> <!-- </property>--> <!--属性值包含特殊符号 1.把<>进行转义 < > 2.把带特殊符号内容写到CDATA --> <property name="address"> <value><![CDATA[<<南京>>]]></value> </property> </bean> </beans>
(3)第三步:测试类测试:
public class TestSpring5 { @Test public void testBook(){ //1.加载spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); //2.获取配置文件的对象 Book book = context.getBean("book",Book.class); book.testDemo(); } }
运行结果如下:
使用set方法进行注入
(1)创建类,定义属性,创建属性对应有参数构造方法
public class Orders { private String oname; private String address; public Orders(String oname,String address){ this.oname = oname; this.address = address; } public void ordersTest(){ System.out.println(oname+"::"+address); } }
(2)在spring配置文件中进行配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <bean id="orders" class="com.ioc.spring5.Orders"> <constructor-arg index="0" name="oname" value="电脑"></constructor-arg> <!-- <constructor-arg name="address" value="China"></constructor-arg>--> <constructor-arg index="1" name="address" value="西安"></constructor-arg> </bean> </beans>
xml注入集合属性(数组、list、map、set)
首先我们创建实体类:
public class Stu { //1. 数组类型属性 private String[] courses; //2.list集合类型属性 private List<String> list; //3.map集合类型属性 private Map<String,String> map; //4.set集合类型属性 private Set<String> sets; public void setSets(Set<String> sets) { this.sets = sets; } public void setCourses(String[] courses) { this.courses = courses; } public void setList(List<String> list) { this.list = list; } public void setMap(Map<String, String> map) { this.map = map; } public void test(){ System.out.println(Arrays.toString(courses)); System.out.println(list); System.out.println(map); System.out.println(sets); } }
其次编写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" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <!--集合类型属性注入--> <bean id="stu" class="com.ioc.spring5.collectiontype.Stu"> <!--数组类型属性注入--> <property name="courses"> <array> <value>java课程</value> <value>数据库课程</value> </array> </property> <!--list类型属性注入--> <property name="list"> <list> <value>张三</value> <value>小三</value> </list> </property> <!--map类型属性注入--> <property name="map"> <map> <entry key="JAVA" value="java"></entry> <entry key="PHP" value="php"></entry> </map> </property> <!--set类型属性注入--> <property name="sets"> <set> <value>MySQL</value> <value>Redis</value> </set> </property> </bean> </beans>