spring ioc入门(自用笔记,仅供参考,欢迎讨论)

spring的文档看的让人发晕。。
https://docs.spring.io/spring/docs/5.1.4.RELEASE/spring-framework-reference/core.html#beans-introduction
但是没办法,还是要看。。来吧
1.1介绍了IOC(DI)解释不清楚,看到代码再说

文档这句写了ioc的包。(然而最后测试时候用了不止这2个)
The org.springframework.beans and org.springframework.context packages are the basis for Spring Framework’s IoC container

这句说bean的实例化装配由容器完成
A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container

1.2
那么容器通过什么来实例化bean呢,有个接口 org.springframework.context.ApplicationContext

再看下面,通过这2个来实现接口
it is common to create an instance of ClassPathXmlApplicationContext or FileSystemXmlApplicationContext

1.2.1 下面的例子介绍了xml配置元数据的方法
The following example shows the basic structure of XML-based configuration metadata:
在这里插入图片描述
id是标示符,class是类的全名。

1.2.2
实例化容器:
读取了2个xml的配置文件:
在这里插入图片描述
services.xml配置文件中
容器初始化了一个PetStoreServiceImpl的实例化对象,id=petStore。但是这个过程需要传入2个参数(property)
accountDao对象来自accountDao类,itemDao对象来自itemDao类
在这里插入图片描述
再往下看
daos.xml配置文件中
容器初始化了2个对象,accountDao,itemDao,分别和上面对应。
在这里插入图片描述
简单的说,当需要PetStoreServiceImpl的时候,容器通过配置文件的关联,自己生成需要的参数(accountDao,itemDao),而不需要我们new一个accountDao,再new一个itemDao,最后再去生成 PetStoreServiceImpl了

下面说可以读取多个配置文件,或者在一个配置文件中,import其他的配置文件,
在这里插入图片描述
有一定的约束,先略

1.2.3 Using the Container
当实例化了容器后,当然要使用它
在这里插入图片描述
第一步是初始化容器
第二步通过容器的getBean获得 id=petStorede(实际的类是PetStoreServiceImpl)的实例化对象 Service,
最后 使用service对象

那么到这里,整个逻辑就串联起来了。测试一下看看。
比如要实现保存用户名和密码的程序,(演示spring不涉及数据库)
为了拓展和分层,具体保存的业务逻辑封装在另一类中,而再这之前,数据库的操作先实现接口

我需要一个实体类(entity.User)
需要一个服务类(service.UserService)
需要一个数据库接口(dao.UserDAO)以及对应的实现类(daoImpl.UserDAOImpl)
在实现类中保存数据,这时,服务类调用实现类的对象来操作保存的业务。

先不加入spring,看下代码

实体类(entity.User)
在这里插入图片描述
数据库接口(dao.UserDAO)
在这里插入图片描述
以及对应的实现类(daoImpl.UserDAOImpl)
在这里插入图片描述
服务类(service.UserService)
在这里插入图片描述
测试方法
在这里插入图片描述

结果
在这里插入图片描述
**

看代码的话感觉服务类和接口实现类的功能非常接近,但是服务类不光有保存的方法,还可以有其他的业务逻辑,而接口实现类只处理和数据库相关的功能,当需要换数据库的时候,只要换一套新的实现类即可,服务类new新的实现类即可,其他都不需要改了。再想想spring ioc是干嘛用的?简单来说,就是帮我们new对象,这样一来,service完全都不用改了,直接在spring的配置文件改下就好了。维护和拓展的可操作性大大提高了。

**

接下来引入spring,先观察一下,哪些对象可以通过spring来配置
第一个在测试类中的服务类(UserService),同时,这个类初始化的时候需要一个参数(property):实现类的对象(UserDAOImpl),这个是第二个。
按这个逻辑来做配置文件:
在这里插入图片描述
引入jar包
在这里插入图片描述

UserService 类中userDAOImpl不需要我们来new了。
在这里插入图片描述
测试类代码
在这里插入图片描述

报错
在这里插入图片描述
加入commons-logging-1.1.3.jar
加入spring-expression-5.1.4.RELEASE.jar

结果:
在这里插入图片描述
那么到此,最基本的ioc就实现了。

下面增加基于注解的简单测试:
文档写的太全面,就不按文档来了,先从最简单测,遇到再追加。

1,配置文件只要这2句就可以了(注意上面的namespace有增加)
在这里插入图片描述
2.@component 没有写参数默认就是类名首字母小写 @component(“userService”) 相当于bean id=userService
@resource 就是@resource(name=“userDAO”) 相当于 property name=“userDAO”
在这里插入图片描述
那么上面那个userDAO从哪里拿?所以实现类上也要@component
在这里插入图片描述
@resource和@component是如何匹配上的呢?
@resource,默认是userDAO,
@component,默认是UserDAOImpl2

我都没有带参数,默认的名字不同 但是测试通过,
那么我再创建了一个@component,默认是UserDAOImpl, 这样有2个实现类,测试 失败。
我再在其中一个@component 加入参数@component (“userDAO”) 测试成功
那么结论就是,如果不带参数,先按名字匹配,找不到再按类型,如果类型重复,就报错


下面的无视,spring的文档真心难看


1.3.1,bean可以起别名?
1.3.2
Instantiation with a Static Factory Method
主要讲述特殊情况下bean的配置,估计不常用,先略。
在这里插入图片描述
Instantiation by Using an Instance Factory Method
在这里插入图片描述
多个工厂方法
在这里插入图片描述
下面这个等同于静态工厂?在这里插入图片描述
含参构造器,多个参数的情况要避免歧义。

下面这个情况,假设ThingTwo和ThingThree类不是通过继承来关联的
在这里插入图片描述
再看这个
在这里插入图片描述
通过类型
在这里插入图片描述
通过参数索引
在这里插入图片描述
通过构造参数名字
在这里插入图片描述
1.4.2.
直接设置值的情况,看这个值就知道是jdbc的参数
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值