Spring框架中IOC就是将创建对象的权力反转给Spring框架,我们无需自己创建对象,直接在Spring框架的容器中获取即可。
bean中配置的就是需要让Spring管理的类。
XML的bean管理
先写个“HelloWorld”:
<bean id="User" class="com.ffyc.spring.model.User" scope="singleton"><property name="id" value="11"></property><property name="name" value="aaa"></property><constructor-arg name="id" value="111"></constructor-arg><constructor-arg name="name" value="aaa"></constructor-arg></bean>
上面代码的含义就是创建单例的User对象,并且实现了依赖注入。bean依赖注入的两种方式:一种是属性的set方法注入(property标签),通过Java反射机制(所以前提是User类中必须存在当前属性的set方法),为属性赋值。另一种是构造方法的注入(constructor-arg标签),通过类中的构造方法赋值。
以上代码描述了通过bean标签实现通过Spring创建对象并赋值,称为依赖注入(Dependency Injection)DI。
在实际开发中并没有如此简单,例如在一个类中调用另一个类,使用bean标签该如何处理呢?
public class UserService {UserDao userDao;public void saved(){userDao.save();}
}
<bean id="UserDao" class="com.ffyc.spring.Dao.UserDao"></bean><bean id="UserService" class="com.ffyc.spring.Service.UserService"><property name="userDao" ref="UserDao"></property></bean>
如上我们新建UserDao类和UserService类,在UserService类中调用UserDao类中的方法,使用bean管理这两个类。
使用XML我们发现工作量太大,如果模块很多,那每次加入一个模块就要添加一个bean。
使用注解进行bean管理
<context:component-scan base-package="com.ffyc.spring"></context:component-scan>
在Spring中配置当前标签,就可以通过注解,自动扫描指定包下的类,可自动解析注解。
模型类:
@Data
@Component("User")
@Scope("prototype")
public class User {private Integer id;private String name;}
数据访问层:
@Data
@Repository("userDao")
public class UserDao {public void save() {System.out.println("保存成功!");}
}
Service层:
@Data
@Service("userService")
public class UserService {@Autowired //属性的注入@Qualifier("userDao")UserDao userDao;public void saved(){userDao.save();}
}
各层类使用不同的注解标签和名字。在Spring框架中,一般把由Spring框架管理创建的对象称为一个bean对象,与我们普通的对象不同,因为Spring框架可以进行功能上的增强。
补充:Spring为了每层更加清晰,(为了后续的扩展功能,在不同层使用不同的注解标记)
模型类:@Compontent
Service层:@Service
数据访问层:@Repository
Spring中注解的自动注入:
两种方式:
1,@Autowired Spring框架中提供的注解标签,可以提供两种方式进行属性注入。
①bean名称注入 @Qualifier(value="bean名称")
@Data
@Service("userService")
public class UserService {@Autowired //属性的注入@Qualifier("userDao")UserDao userDao;public void saved(){userDao.save();}
}
@Data
@Repository("userDao")
public class UserDao {Integer id;String name;public void save() {System.out.println("保存成功!");}
}
②属性类型注入,如果没有指定名称,那么就是属性类型去容器中查找对应类型对象(常用)
@Data
@Service("userService")
public class UserService {@Autowired //属性的注入UserDao userDao;public void saved(){userDao.save();}
}
@Data
@Repository
public class UserDao {Integer id;String name;public void save() {System.out.println("保存成功!");}
}
2,@Resource JDK提供的注解标签
没有给定指定名称,就通过类型查找注入,若给定,则通过名称注入
@Data
@Service("userService")
public class UserService {@ResourceUserDao userDao;public void saved(){userDao.save();}
}
@Data
@Repository
public class UserDao {Integer id;String name;public void save() {System.out.println("保存成功!");}
}