目录
1、框架
1.1、框架的作用
我们使用Java作为开发语言时,几乎都需要使用ee框架(ssm),其中的 ssm 指的是 spring(boot):基本的脚手架,springmvc:专门做web开发,mybatis:数据库框架。广义的说,框架满足某些特定功能(比较多且强大),我们是在这些框架封装的代码设计上进行开发。使用框架可以提高开发效率,让我们能更好的管理项目。
1.2、核心库–bean
和集合框架中的容器类似,bean容器的主要作用是存储和使用bean对象:
- 注册:创建一个bean对象,存储到容器中。 如:map.put(“id”, new Person())
- 注入:从容器中取一个对象,注入到某个地方(某个对象的属性,方法参数)。如 Person p = map.get(“id”); p.think();
2、spring 项目的搭建
- 搭建 Maven 项目
- 在 pom.xml 文件中添加 spring-beans、spring-context 两个依赖包
- 如果引入失败(依赖项是红色的),则检查idea中 maven配置是否正确
- 修改完 pom.xml 后,一定要刷新 maven 面板,且检查 maven 面板中依赖项是否成功引入。
3、bean 的注册和注入
3.1、bean 的注册
创建容器,填写需要被扫描的包路径,在包及子包路径下,如果存在spring框架注解的类,就会自动注册到容器中。
要想将对象存储在 Spring 中,有两种注解类型可以实现:类注解和方法注解。
3.1.1、类注解
在指定的包下创建类,并将其类注解,那么该类会自动注册到容器中,注册的数据是键值对,键:类名首字母小写,值:bean对象。
类注解:@Controller、@Service、@Repository、@Component、@Configuration。接下来我们分别来看。
- @Controller(控制器存储)
此时我们读取上面的UserController对象。
- @Service(服务存储)
- @Repository(仓库存储)
- @Component(组件存储)
- @Configuration(配置存储)
注:通常我们 bean 使用的都是标准的大驼峰命名(当标识符只有一个单词的时候,首字母大写;当标识符有多个单词的时候,所有单词的首字母均是大写),而读取的时候首字母小写就可以获取到 bean 了。
这些类注解功能是一样的,那么为什么要这么多类注解,原因是程序员看到类注解之后,就能直接了解当前类的用途,比如:
@Controller:表示的是业务逻辑层;
@Servie:服务层;
@Repository:持久层;
@Configuration:配置层。
@Component:没有特殊含义就用一般组件。
3.1.2、方法注解
注册 bean,还可以利用方法注解 @Bean,方法注解是放到某个方法上的。注册的数据是键值对,键:方法名,值:方法返回值。而且方法注解要配合类注解使用,即当前类是容器管理的bean对象,然后利用方法注解才会生效。
引申:类注解是注册一个单例的 Bean 对象,而 @Bean方法注解,可以注册多个 Bean 对象,注册多个的好处是可以根据需要注入其中指定的一个。
3.1.3、重命名 Bean
- 类注解(“Bean名称”)。
- 方法注解(“Bean名称”),可以通过设置 name 属性给 Bean 对象进行重命名操作:@Bean ( name = { “名字1” , “名字2” } ),只有一个名字时可以不使用 {}。
总结:需要满足以下两个条件才可以自动注册:
1、在指定的包路径下
2、有 spring 框架注解
由此可得,bean 注册省略了 new 对象和容器.add/put两个步骤
3.2、bean 的注入
获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注入。对象装配(对象注入)的实现方法以下 3 种: 属性注入、构造方法注入、Setter 注入
3.2.1、属性注入
属性注入是使用 @Autowired 实现的。
- 容器中注册两个类:Person、Mobile
- 在 Person 类中增加 Moblie 属性,且这里的属性是容器中的 Mobile 类
3.2.2、构造方法注入
构造方法注入是在类的构造方法中实现注入。如果类只有一个构造方法,那么@Autowired 注解可以省略;如果类中有多个构造方法,那么需要添加上 @Autowired 来明确指定到底使用哪个构造方法。
3.2.3、Setter 注入
在设置 set 方法的时候加上 @Autowired 注解。
3.2.4、@Resource:另一种注入关键字
在进行类注入时,除了可以使用 @Autowired 关键字之外,我们还可以使用 @Resource 进行注入。
@Autowired 和 @Resource 的区别
1、出身不同:@Autowired 来自于 Spring,而 @Resource 来自于JDK 的注解;
2、使用时设置的参数不同:相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如 name 设置,根据名称获取 Bean。
3.2.5、同一类型多个 @Bean 注入对象时报错
当出现以下多个 Bean,返回同一对象类型时程序会报错,报错的原因是,非唯一的 Bean 对象。
解决同一个类型,多个 bean 的解决方案有以下两个:
- 使用 @Resource(name=“XXX”) 定义。
- 使用 @Autowired,加上 @Qualifier 注解定义名称。
总结:在代码使用上带来了改变,以前是一片代码写完,现在是看起来代码没关系,但是spring已经内部建立了对象和对象间的关系(依赖关系:X x = new X(); m.x = x,此时 x 和 m 存在一定的依赖关系,即 m 依赖 x ),更多的是注解的使用。