Spring两大特性:IOC控制反转、AOP面向切面编程。
- IOC:控制反转,把创建对象的过程交给 Spring 进行管理(DI:依赖注入,在IoC容器内将有依赖关系的bean进行关系绑定。成员变量有两种注入方式:set注入、构造方法注入)。
- AOP:面向切面编程,在不动源代码的基础上对代码进行增强。他利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为“Aspect”,即切面,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并利用于未来的可操作性和可维护性。
- aop使用场景:如权限认证、日志、事务等等
在项目中,注入spring容器中bean对象时,均可使用@Resource。
目前IDEA不推荐使用@Autowried,原因:@Autowried是spring提供的,并非是Java标准,而@Resource是Java标准定义的,推荐使用。
如果想使用@Autowried的话,建议通过构造器注入(成员字段上用final修饰不需要加注解,类上添加@RequiredArgsConstructor注解)。
Spring的三种注入方式
在Spring中,默认情况下,bean的注入方式是使用构造器注入(Constructor Injection)。意味着,当Spring创建新的bean实例时,它会调用一个构造函数,并将依赖关系作为参数传递给该构造函数。
虽然构造函数注入是默认的首选方式,但Spring也允许使用Setter方法注入或字段注入,具体取决于您的需求和项目的配置。如果构造函数不存在或未标记为@Autowired,则会尝试使用Setter方法注入或字段注入方式。
方式1:字段注入(在初始化bean时,底层通过反射为属性赋值)
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;
}
方式2:构造函数注入
- 构造函数注入可以保证重要属性预先设置
- 无需提供每个属性的setter方法,减少类的方法个数
- 可以更好地封装类的变量,避免外部错误调用
@Service
public class UserService {private final UserMapper userMapper;@Autowiredpublic UserService(UserMapper userMappe) {this.userMappe = userMappe;}
}
简化写法:
@Service
@RequiredArgsConstructor //lombok提供
public class UserService {private final UserMapper userMapper;
}
方式3:setter方式注入
@Service
public class UserService {private UserMapper userMapper;@Autowiredpublic void setRepository( UserMapper userMapper) {this.userMappe = userMappe;}
}
@Autowried和@Resource的区别
- @Autowired和@Resource都是用来进行依赖注入的。
- @Autowired:默认按照类型注入,如果一个类型下有多个bean就会报错,可以借助@Qualifier指定bean的名字注入。@Autowired注解可以对构造器、方法、参数、字段使用。
- @Resource:默认按照bean的名子找,如果找不到则按照bean的类型找,找到就直接注入,找到多个则会报错。可以给@Resource注解配置name属性,只会找叫这个名字的Bean对象。@Resource注解只能对方法、字段使用,不能用于构造器。
- @Autowired是Spring提供的(spring环境才能使用),@Resource是SR-250提供的。
- 基本上@Resource可以完全替代@Autowired。
- 扩展:还有一个@Inject注解,它和@Autowired注解的工作原理是一样的,不过它也是JDK层面提供的