Spring框架中IOC就是将创建对象的权力反转给Spring框架,我们无需自己创建对象,直接在Spring框架的容器中获取即可。
bean中配置的就是需要让Spring管理的类。
先写个“HelloWorld”:
上面代码的含义就是创建单例的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();
}
}
如上我们新建UserDao类和UserService类,在UserService类中调用UserDao类中的方法,使用bean管理这两个类。
使用XML我们发现工作量太大,如果模块很多,那每次加入一个模块就要添加一个bean。
在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 {
@Resource
UserDao userDao;
public void saved(){
userDao.save();
}
}
@Data
@Repository
public class UserDao {
Integer id;
String name;
public void save() {
System.out.println("保存成功!");
}
}