什么是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>
使用注解
常用注解 | 基本含义 |
---|---|
@Component | Spring中的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创建 |