本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中,了解如何使用注释来获取容器中的Bean对象,如有错误,请在评论区指正,让我们一起交流,共同进步!
1.查看是否添加依赖成功
2.配置扫描路径:自定义
位置处于自己创建的.xml文件中,路径内容只需要修改自己创建的路径即可;
配置完路径:会扫描路径下的类,有注释的加入容器中;
类注释的目的:看到类注释,就能了解当前类的用途;
a)@Controller:控制器存储,校验参数合法性;
b)@Service:服务存储,业务组装(方法组装),看调用什么方法,不进行业务的实现;- 告诉你办理什么业务;
c)@Repository:仓库存储(数据持久层),进行实际业务的处理 ; - 实际去办一个个业务;
d)@Component:组件存储,工具类层,通用的工具;
e)@Configuration:配置存储,配置层,对项目进行设置;
使用: - 在所创建的类上,添加对应注释即可;
【注】
Bean的命名规则源码:
【注】
1.@Bean注释,加在方法上的;
2.@Bean注释,必须配合五大类注释一起使用;
为什么需要与五大类注释配合使用呢?
方法太多,寻找一个方法,可能会扫描包下的所有方法,相比较来说类比较少,通过类找方法会快很多;
@Bean与五大类配合使用代码示例:
推荐使用@Component
3.获取@Bean命名方式:@Bean的默认命名 == 方法名(id == 方法名)
但是这样命名有弊端,如果方法名为getxxx(), setxxx(), 这样调用这个对象是不恰当的,所以就需要给方法重新命名;再获取Bean对象就是根据重命名来获取;
重命名@Bean方式:给@Bean添加属性,设置名称;
a)@Bean(“abc”) : 没写属性,直接命名
b)@Bean(name = “bb”) : 写属性name并设置命名
c)@Bean(value = “cc”) :写属性value并命名
【注】
① 命名可以指定多个命名 : @Bean(name = {“aa”, “bb”})
② 对@Bean重命名后,就不能使用原来的方法名来获取对象;
③ 对于类注释,不支持起多个命名;(相当于不能给一个类取多个命名)
④ 对于@Bean名称,如果多个@Bean使用相同的名称,程序不报错,在同一个类中,除第一个@Bean之后的对象不会被存放到容器中,再有相同名称的Bean存储时,容器自动忽略不存储;
如果使用@Bean重命名,命名名称一样:就需要根据加载顺序来确定,通过@Order() 来声明一个类的加载时机,@Order() 中括号中的值越大,就先加载通过那个类;
@Order(100) > @Order(1) ;
获取对象 / 对象注入:取出一个对象放到某个类中;
获取对象的注释:@Autowired 或者 @Resource
@Resource注入 作用类似 @Autowired 二者区别:
1.@Resource 来自 jdk; @Autowired 来自Spring框架;
2.支持参数个数不同:@Resource 支持多参数设置;@Autowired 只支持一个参数设置;
3.使用方式不同:@Resource 不支持构造方法注入;@Autowired 支持构造方法注入;
4.idea兼容性支持不同:@Resource 不存在报错情况;@Autowired 在专业版情况下可能报错;(解决报错方法:@Autowired(required = false) 给括号中设置false值,表明此时对象不存在也可以)
属性注入属于:通过注释从容器中获取对象,注入到设置的变量中,在之后的方法中就能使用;
优点:属性注入,使用简单;
缺点:无法注入 final 修饰的对象;
通用性 - 只适用于 IoC容器;
【注】被final修饰的变量需要直接复制 或者 在构造方法中进行赋值;
问题:同一类型Bean存储到容器多个,获取Bean时出现错误;
解决方式:
a) 将属性的名字 和 Bean的名字对应上;
b) 使用@Autowried + @Qualifier()进行筛选
c) 使用@Resource 设置name名称指定获取某个对象;
构造方法注入使用:在构造方法上添加@Autowired, 从容器中获取UserRepository对象注入到对应属性中;
优点:可以注入一个final修饰的对象;
注入的对象不会被修改,构造方法 只会加载一次;
构造方法注入可以保证 对象完全初始化;
构造方法通用性更好;
缺点:
写法复杂;
使用构造方法注入,无法解决循环依赖的问题;
@Service
public class User4 {
private UserRepository userRepository;
//在构造方法上添加@Autowired
@Autowired
public User4(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
setter注入使用:在setter方法上加上@Autowired, 在执行对应类时,会从容器中拿到对象,并注入到setter中的参数;
优点:符合单一设计原则 - Setter只有set一个属性
缺点:无法注入final修饰的变量;
setter注入的对象可以被修改;(setter本身可能被多次调用修改)
@Service
public class User3 {
private UserRepository userRepository;
//@Autowired注释setter就会从容器中获取对应对象,再注入到对应参数UserRepository属性中;
@Autowired
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
✨✨✨各位读友,本篇分享到内容如果对你有帮助给个赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!