IoC(Inversion of Control)和DI(Dependency Injection)

什么是IoC

IoC(Inversion of Control):将对象的创建权交给Spring。

一个IoC程序

创建com.itheima.ioc包,创建接口UserDAO。

package com.itheima.ioc;
public interface UserDao {
	public void say();
}

创建接口实现类:

package com.itheima.ioc;
public class UserDaoImpl implements UserDao {
	public void say() {
		System.out.println("userDao say hello World !");
	}
}

创建一个bean,把类的创建权交给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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"> 
	<!-- 将指定类配置给Spring,让Spring创建其对象的实例 -->
	<bean id="userDao" class="com.itheima.ioc.UserDaoImpl" />
</beans>

测试:

public static void main(String[] args) {
		//1.初始化spring容器,加载配置文件
		ApplicationContext applicationContext = 
		    new ClassPathXmlApplicationContext("applicationContext.xml");
		//2.通过容器获取userDao实例
		UserDao userDao = (UserDao) applicationContext.getBean("userDao");
		//3.调用实例中的say()方法
		userDao.say();
	}

什么是注入

DI(Dependency Injection):Spring将被依赖对象赋值给调用者的成员变量。
构造方法注入:

<bean id="userService" class="com.itheima.ioc.UserServiceImpl">
	<constructor-arg name="" value="" />
	<constructor-arg name="" ref="" />
</bean>

Setter方法注入:

	<bean id="userService" class="com.itheima.ioc.UserServiceImpl">
	<!-- 将id为userDao的Bean实例注入到userService实例中 -->
		<property name="userDao" value="userDao" />
	  	<property name="userDao" ref="userDao" />
	</bean>
	

比较特殊的集合类型注入:

	<!-- 注入数组类型 -->
	<bean id="collectionBean" class="com.itheima.spring.demo5.CollectionBean">
		<!-- 数组类型 -->
		<property name="arrs">

			<list>
				<value>王东</value>
				<value>赵洪</value>
				<value>李冠希</value>
			</list>
		</property>
		
		<!-- 注入list集合 -->
		<property name="list">
			<list>
				<value>李兵</value>
				<value>赵如何</value>
				<value>邓凤</value>
			</list>
		</property>
		
		<!-- 注入set集合 -->
		<property name="set">
			<set>
				<value>aaa</value>
				<value>bbb</value>
				<value>ccc</value>
			</set>
		</property>
		
		<!-- 注入Map集合 -->
		<property name="map">
			<map>
				<entry key="aaa" value="111"/>
				<entry key="bbb" value="222"/>
				<entry key="ccc" value="333"/>
			</map>
		</property>
	</bean>

使用注解

常用注解基本含义
@ComponentSpring中的Bean。
@Repository数据访问层(DAO)标识的Bean。
@Service业务层标识的Bean。
@Controller控制层标识的Bean。
@Value设置普通属性的值。
@Autowired对象类型属性的设置,默认按照bean类型注入(很长的类名)
@Resource对象类型属性的设置,默认按照bean实例名称注入(取的bean的名字,@Component注解后面的)。
@Qualifier与Autowired配合使用,会将默认的按bean类型注入修改为按照bean的实例名称注入。@Autowired+@Qualifier(value=“beanName”)=@Resource(name=“beanName”)

无set方法直接在属性上面添加注解;有set方法在set方法上添加注解。
首先要在Spring配置文件通知扫描指定包下所有类:

<context:component-scan base-package="com.itheima.annotation" />

再在代码中加入注解:

//在userDAOImpl中
import org.springframework.stereotype.Repository;
@Repository("userDao") 
public class UserDaoImpl implements UserDao{
   public void save(){
	  System.out.println("userdao...save...");
   }
}
//在UserServiceImpl.java中
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service("userService") 
public class UserServiceImpl implements UserService{
	@Resource(name="userDao") 
	private UserDao userDao;
	public void save() {
         //调用userDao中的save方法
		this.userDao.save();
		System.out.println("userservice....save...");
	}
	
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}

bean 的作用域:scope属性

作用域名称说明
singleton始终指向一个对象
prototype多个对象
request为每一个创建,和Request请求生存一致
session为每一个创建,与session实例生存一致
globalSession一个对象
application为每一个ServletContext创建
websocket为每一个websocket创建
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值