网站如何制作,龙岩古田,寿光网络推广公司,做网站需要域名和什么Spring基础 - Spring核心之控制反转(IOC)
引入
Spring框架管理这些Bean的创建工作#xff0c;用户管理Bean转变为框架管理Bean#xff0c;这个称之为控制翻转Spring框架托管创建的Bean放在IOC容器中Spring框架为了更好让用户配置Bean#xff0c;必然会引入不同方式来配置B…Spring基础 - Spring核心之控制反转(IOC)
引入
Spring框架管理这些Bean的创建工作用户管理Bean转变为框架管理Bean这个称之为控制翻转Spring框架托管创建的Bean放在IOC容器中Spring框架为了更好让用户配置Bean必然会引入不同方式来配置Bean这便是xml配置java配置,注解配置Spring需要管理整个Bean的生命周期应用程序代码从Ioc Container中获取以来的Bean资源注入到应用程序中这个过程叫做依赖注入所以说控制翻转通过依赖注入实现IOC是设计思想DI是实现方式在依赖注入autowired,resource
如何理解IoC Spring里面的bean就类似是定义的一个组件而这个组件的作用就是实现某个功能的这里所定义的bean就相当于给了你一个更为简便的方法来调用这个组件去实现你要完成的功能 传统Java SE程序设计我们直接在对象内部通过new进行创建对象是程序主动去创建依赖对象而IoC是有专门一个容器来创建这些对象即由Ioc容器来控制对 象的创建谁控制谁当然是IoC 容器控制了对象控制什么那就是主要控制了外部资源获取不只是对象包括比如文件等 传统程序设计下都是主动去创建相关对象然后再组合起来 当有了IoC/DI的容器后在客户端类中不再主动去创建这些对象了 在IoC/DI思想中应用程序就变成被动的了被动的等待IoC容器来创建并注入它所需要的资源了
IoC和DI是什么关系
组件之间的依赖关系由容器在运行期间决定依赖注入的目的是为了提升组件重用的频率为系统搭建一个灵活可扩展的平台通过依赖注入机制我们只需要通过简单的配置无需任何代码就可以指定目标需要的资源完成自身的业务逻辑应用程序依赖于IOC容器应用程序需要IOC容器来提供对象需要的外部资源IOC容器注入应用程序某个对象应用程序依赖的对象注入某个对象所需要的外部资源
Ioc 配置的三种方式
xml配置
将Bean的信息配置xml文件里通过spring加载文件为我们创建Bean资源
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd!-- services --bean iduserService classtech.pdai.springframework.service.UserServiceImplproperty nameuserDao refuserDao/!-- additional collaborators and configuration for this bean go here --/bean!-- more bean definitions for services go here --
/beans
Java 配置
将类的创建交给我们配置的JavaConfig来完成Spring只负责维护和管理采用纯Java创建方式本质将xml配置声明转移到Java配置类创建一个配置类添加Configuration注解声明为配置类创建方法方法加上Bean注解该方法用于创建实例并且返回创建之后交给spring管理 /*** author pdai*/
Configuration
public class BeansConfig {/*** return user dao*/Bean(userDao)public UserDaoImpl userDao() {return new UserDaoImpl();}/*** return user service*/Bean(userService)public UserServiceImpl userService() {UserServiceImpl userService new UserServiceImpl();userService.setUserDao(userDao());return userService;}
}注解配置
通过在类上加注解的方式来声明一个类交给Spring管理Spring会自动扫描带有Component Controller Service Repository需要配置Spring的注解扫描器对类添加Component相关的注解比如ControllerServiceRepository设置ComponentScan的basePackage, 比如context:component-scan base-package‘tech.pdai.springframework’, 或者ComponentScan(“tech.pdai.springframework”)注解或者 new AnnotationConfigApplicationContext(“tech.pdai.springframework”)指定扫描的basePackage.
/*** author pdai*/
Service
public class UserServiceImpl {/*** user dao impl.*/Autowiredprivate UserDaoImpl userDao;/*** find user list.** return user list*/public ListUser findUserList() {return userDao.findUserList();}}
依赖注入的三种方式
构造方法注入(Construct注入)Setter注入基于注解的注入接口注入
setter方式
在XML配置方式中property都是setter方式注入
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd!-- services --bean iduserService classtech.pdai.springframework.service.UserServiceImplproperty nameuserDao refuserDao/!-- additional collaborators and configuration for this bean go here --/bean!-- more bean definitions for services go here --
/beans
需要new UserServiceImpl()创建对象 所以需要默认构造函数调用setUserDao函数注入userDao的值所以需要setUserDao函数
/*** author pdai*/
public class UserServiceImpl {/*** user dao impl.*/private UserDaoImpl userDao;/*** init.*/public UserServiceImpl() {}/*** find user list.** return user list*/public ListUser findUserList() {return this.userDao.findUserList();}/*** set dao.** param userDao user dao*/public void setUserDao(UserDaoImpl userDao) {this.userDao userDao;}
}
在注解和Java配置方式下 /*** author pdai*/
public class UserServiceImpl {/*** user dao impl.*/private UserDaoImpl userDao;/*** find user list.** return user list*/public ListUser findUserList() {return this.userDao.findUserList();}/*** set dao.** param userDao user dao*/Autowiredpublic void setUserDao(UserDaoImpl userDao) {this.userDao userDao;}
}构造函数
在XML配置方式中是通过构造函数参数注入比如下面的xml: ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd!-- services --bean iduserService classtech.pdai.springframework.service.UserServiceImplconstructor-arg nameuserDao refuserDao/!-- additional collaborators and configuration for this bean go here --/bean!-- more bean definitions for services go here --
/beans本质上是new UserServiceImpl(userDao)创建对象, 所以对应的service类是这样的
/*** author pdai*/
public class UserServiceImpl {/*** user dao impl.*/private final UserDaoImpl userDao;/*** init.* param userDaoImpl user dao impl*/public UserServiceImpl(UserDaoImpl userDaoImpl) {this.userDao userDaoImpl;}/*** find user list.** return user list*/public ListUser findUserList() {return this.userDao.findUserList();}}
Autowired和Resource以及Inject等注解注入有何区别 Autowired是Spring自带的注解通过AutowiredAnnotationBeanPostProcessor 类实现的依赖注入 Autowired可以作用在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE Autowired默认是根据类型byType 进行自动装配的 如果有多个类型一样的Bean候选者需要指定按照名称byName 进行装配则需要配合Qualifier。 将Autowired写在被注入的成员变量上setter或者构造器上就不用再xml文件中配置了。
resource
1、Resource是JSR250规范的实现在javax.annotation包下 2、Resource可以作用TYPE、FIELD、METHOD上 3、Resource是默认根据属性名称进行自动装配的如果有多个类型一样的Bean候选者则可以通过name进行指定进行注入