目录
一、什么是IOC
二、IOC的程序入门
1.创建mavenJava项目,引入依赖
2.编写接口和实现类
3.编写spring核心配置文件(applicationContext.xml)
4.测试类
5.测试结果-------一个对象
三、Spring框架的Bean管理的配置文件
四、实例化Bean对象的三种方式
1.无参数的构造方法(默认且用的多)
2.静态工厂实例化---一个对象
3.动态工厂实例化方式
五、DI依赖注入
1.属性的set方法注入值
业务层接口:
业务层实现类:
持久层接口:
持久层实现类:
配置文件:
测试类:
运行:编辑
2.属性构造方法方式注入值
业务层实现类:
配置文件:
运行:编辑
3.数组、集合等的注入
CollectionBean 类:
配置文件:
测试类:
运行结果:
六、多配置文件方式
1.主配置文件中包含其他的配置文件
2.工厂创建的时候直接加载多个配置文件
一、什么是IOC
IOC---控制反转,将对象的创建权力交给Spring框架(通过bean标签),
它是面向对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度
二、IOC的程序入门
1.创建mavenJava项目,引入依赖
<dependencies>
<!--spring的核心依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!--测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
2.编写接口和实现类
接口:
package com.qcby.service;
/*
* 业务层接口
* */
public interface UserService {
/*接口中的抽象方法*/
public void hello();
}
实现类:
package com.qcby.service.impl;
import com.qcby.service.UserService;
/*
* 用户模块实现类实现用户模块接口
* */
public class UserServiceImpl implements UserService {
@Override
public void hello(){
System.out.println("Hello IOC!");
}
}
3.编写spring核心配置文件(applicationContext.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">
<!--IOC管理bean-->
<!-- bean的意义是将该类的创建对象权利交给spring框架 -->
<bean id="userService" class="com.qcby.service.UserServiceImpl"></bean>
</beans>
4.测试类
package com.qcby.test;
import com.qcby.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/*
* 测试类
* 测试UserService交给spring管理
* */
public class UserServiceTest {
//测试方法
@Test
public void run1(){
//单例模式:UserService这个类只能创建一个对象
//使用Spring的工厂
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//通过工厂获得类
UserService userService1=(UserService) applicationContext.getBean("userService");
UserService userService2=(UserService) applicationContext.getBean("userService");
userService1.hello();
userService2.hello();
System.out.println(userService1);
System.out.println(userService2);
}
}
5.测试结果-------一个对象
三、Spring框架的Bean管理的配置文件
1.id属性
在约束中采用ID的约束,唯一;
取值要求:必须以字母开始,可以使用字母、数字、连字符、下划线、句话、冒号 ,不能出现特殊字符
2.class属性
bean对象的全路径
3.scope属性
代表Bean的作用范围,有单例和多例
(1)singleton单例(默认值),最常用的方式-----同一对象
(2)prototype多例(相当于new)(两个对象)
四、实例化Bean对象的三种方式
1.无参数的构造方法(默认且用的多)
<bean id="us" class="com.qcby.service.UserServiceImpl"></bean>
2.静态工厂实例化---一个对象
静态工厂是一个对象,已经有了,再用还是原来的
例子:
类:
package com.qcby.demo1;
import com.qcby.service.UserService;
import com.qcby.service.UserServiceImpl;
/*静态工厂方式*/
public class StaticFactory {
public static UserService createUs(){
System.out.println("通过静态工厂的方式创建UserServiceImpl对象...");
return new UserServiceImpl();
}
}
配置文件:
<bean id="us" class="com.qcby.demo1.StaticFactory"
factory-method="createUs"></bean>
3.动态工厂实例化方式
package com.qcby.demo1;
import com.qcby.service.UserService;
import com.qcby.service.UserServiceImpl;
public class Dfactory {
public UserService createUs(){
System.out.println("实例化工厂的方式...");
return new UserServiceImpl();
}
}
配置文件
<bean id="dfactory" class="com.qcby.demo1.Dfactory"></bean>
<bean id="us2" factory-bean="dfactory" factory-method="createUs2"></bean>
五、DI依赖注入
DI依赖注入就是实现IOC的方式
1.属性的set方法注入值
业务层接口:
package com.qcby.service;
/*
* 订单业务层接口
* */
public interface OrderService {
public void saveOrder();
}
业务层实现类:
package com.qcby.service.impl;
/*
* 订单的实现
* 调用持久层操作数据库
* */
import com.qcby.dao.OrderDao;
import com.qcby.service.OrderService;
public class OrderServiceImpl implements OrderService{
private OrderDao orderDao;//它是私有属性,所以必须提供set方法
public void setOrderDao(OrderDao orderDao) {
this.orderDao = orderDao;
}
public void saveOrder(){
orderDao.saveOrder();
}
}
持久层接口:
package com.qcby.dao;
/*
* 持久层接口
* 保存订单
* */
public class OrderDao {
public void saveOrder();
}
持久层实现类:
package com.qcby.dao;
public class OrderDaoImpl implements OrderDao {
@Override
public void saveOrder(){
System.out.println("保存了订单!");
}
}
配置文件:
<bean id="os" class="com.qcby.service.impl.OrderServiceImpl">
<property name="orderDao" ref="od"></property>
</bean>
<bean id="od" class="com.qcby.dao.OrderDao"></bean>
测试类:
package com.qcby.test;
import com.qcby.service.OrderService;
import com.qcby.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class OrderServiceTest {
@Test
public void run1(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
OrderService orderService=(OrderService)applicationContext.getBean("os");
orderService.saveOrder();
}
}
运行:
2.属性构造方法方式注入值
其他不变,
业务层实现类:
package com.qcby.service.impl;
/*
* 订单的实现
* 调用持久层操作数据库
* */
import com.qcby.dao.OrderDao;
import com.qcby.service.OrderService;
public class OrderServiceImpl implements OrderService{
private OrderDao orderDao;
public OrderServiceImpl(OrderDao orderDao) {
this.orderDao = orderDao;
}
public void saveOrder(){
orderDao.saveOrder();
}
}
配置文件:
<bean id="os" class="com.qcby.service.impl.OrderServiceImpl">
<constructor-arg name="orderDao" ref="od"></constructor-arg>
</bean>
<bean id="od" class="com.qcby.dao.OrderDao"></bean>
运行:
3.数组、集合等的注入
用的set方法
CollectionBean 类:
package com.qcby.demo3;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class CollectionBean {
private String[] strs;
public void setStrs(String[] strs) {
this.strs = strs;
}
private List<String> list;
public void setList(List<String> list) {
this.list = list;
}
private Map<String,String> map;
public void setMap(Map<String, String> map) {
this.map = map;
}
private Properties properties;
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public String toString() {
return "CollectionBean{" +
"strs=" + Arrays.toString(strs) +
", list=" + list +
", map=" + map +
", properties=" + properties +
'}';
}
}
配置文件:
<!--给集合属性注入值-->
<bean id="collectionBean" class="com.qcby.demo3.CollectionBean">
<property name="strs">
<array>
<value>美美</value>
<value>小凤</value>
</array>
</property>
<property name="list">
<list>
<value>熊大</value>
<value>熊二</value>
</list>
</property>
<property name="map">
<map>
<entry key="aaa" value="老王"></entry>
<entry key="bbb" value="小王"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="username">张三</prop>
<prop key="password">1234</prop>
</props>
</property>
</bean>
测试类:
package com.qcby.test;
import com.qcby.demo3.CollectionBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class CollectionTest {
@Test
public void run(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean collectionBean= (CollectionBean) applicationContext.getBean("collectionBean");
System.out.println(collectionBean);
}
}
运行结果:
六、多配置文件方式
多配置文件的加载方式
1.主配置文件中包含其他的配置文件
<?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">
<import resource="applicationContext2.xml"></import>
</beans>
2.工厂创建的时候直接加载多个配置文件
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml",
"applicationContext2.xml");