前言
本篇在spring中如何使用五大类注释与方法注释将对象加入IOC容器中,了解如何使用注释来获取容器中的Bean对象,如有错误,请在评论区指正,让我们一起交流,共同进步!
文章目录
- 前言
- 1.通过注释将类加入IoC容器中
- Maven项目创建,前提准备:
- 添加注释 - 储存Bean对象
- 1.类注释存储spring
- java中的标准分层 - 写程序时根据这些分层
- 2.方法注释存储Bean对象
- 2. 获取Bean对象 / 对象装配
- 属性注入
- 构造方法注入
- Setter注入
- 总结
本文开始
1.通过注释将类加入IoC容器中
Maven项目创建,前提准备:
1.查看是否添加依赖成功
2.配置扫描路径:自定义
位置处于自己创建的.xml文件中,路径内容只需要修改自己创建的路径即可;
配置完路径:会扫描路径下的类,有注释的加入容器中;
添加注释 - 储存Bean对象
1.类注释存储spring
类注释的目的:看到类注释,就能了解当前类的用途;
a)@Controller:控制器存储,校验参数合法性;
b)@Service:服务存储,业务组装(方法组装),看调用什么方法,不进行业务的实现;- 告诉你办理什么业务;
c)@Repository:仓库存储(数据持久层),进行实际业务的处理 ; - 实际去办一个个业务;
d)@Component:组件存储,工具类层,通用的工具;
e)@Configuration:配置存储,配置层,对项目进行设置;
使用: - 在所创建的类上,添加对应注释即可;
【注】
- Bean的命名规则:(获取加注解的默认id)对于第一个字母大写,第二个字母小写默认id使用小写 - 符合规则前两个字母小写;StudentUser => studentUser
不满足首字母大写 && 第二个字母小写,使用原来id - 非默认情况,id为原类名不变;THead => THead
Bean的命名规则源码:
- 存储Bean,可以使用注解存储,也可以使用xml,存储Bean,二者也可以混用;(类不在同一个包里,可以使用Bean的方式存储)
java中的标准分层 - 写程序时根据这些分层
2.方法注释存储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) ;
2. 获取Bean对象 / 对象装配
获取对象 / 对象注入:取出一个对象放到某个类中;
获取对象的注释:@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@Autowiredpublic User4(UserRepository userRepository) {this.userRepository = userRepository;}
}
Setter注入
setter注入使用:在setter方法上加上@Autowired, 在执行对应类时,会从容器中拿到对象,并注入到setter中的参数;
优点:符合单一设计原则 - Setter只有set一个属性
缺点:无法注入final修饰的变量;
setter注入的对象可以被修改;(setter本身可能被多次调用修改)
@Service
public class User3 {private UserRepository userRepository;//@Autowired注释setter就会从容器中获取对应对象,再注入到对应参数UserRepository属性中;@Autowiredpublic void setUserRepository(UserRepository userRepository) {this.userRepository = userRepository;}
}
总结
✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!