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的参数