You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<beanid="userService"class="tech.duoduo.springframework.service.UserServiceImpl">
<propertyname="userDao"ref="userDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans>
设置ComponentScan的basePackage, 比如 <context:component-scan base-package='tech.duoduo.springframework'>, 或者 @ComponentScan("tech.duoduo.springframework")注解,或者 new AnnotationConfigApplicationContext("tech.duoduo.springframework")指定扫描的basePackage.
@ServicepublicclassUserServiceImpl {
/** * user dao impl. */@AutowiredprivateUserDaoImpluserDao;
/** * find user list. * * @return user list */publicList<User> findUserList() {
returnuserDao.findUserList();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<beanid="userService"class="tech.duoduo.springframework.service.UserServiceImpl">
<propertyname="userDao"ref="userDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans>
publicclassUserServiceImpl {
/** * user dao impl. */privateUserDaoImpluserDao;
/** * init. */publicUserServiceImpl() {
}
/** * find user list. * * @return user list */publicList<User> findUserList() {
returnthis.userDao.findUserList();
}
/** * set dao. * * @param userDao user dao */publicvoidsetUserDao(UserDaoImpluserDao) {
this.userDao = userDao;
}
}
在注解和Java配置方式下
publicclassUserServiceImpl {
/** * user dao impl. */privateUserDaoImpluserDao;
/** * find user list. * * @return user list */publicList<User> findUserList() {
returnthis.userDao.findUserList();
}
/** * set dao. * * @param userDao user dao */@AutowiredpublicvoidsetUserDao(UserDaoImpluserDao) {
this.userDao = userDao;
}
}
这种方式比较麻烦,所以在Spring4.x版本中推荐构造函数注入。
2、构造函数
在XML配置方式中 ,<constructor-arg>是通过构造函数参数注入,比如下面的xml:
<?xml version="1.0" encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<beanid="userService"class="tech.duoduo.springframework.service.UserServiceImpl">
<constructor-argname="userDao"ref="userDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans>
@ServicepublicclassUserServiceImpl {
/** * user dao impl. */@AutowiredprivateUserDaoImpluserDao;
/** * find user list. * * @return user list */publicList<User> findUserList() {
returnuserDao.findUserList();
}
}
IoC是什么
Ioc—Inversion of Control,即“控制反转”, 不是什么技术,而是一种设计思想 。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
传统程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
为何是反转,哪些方面反转了 ?
有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
Example
在传统程序设计中,由于userService依赖与UserDao,此时我们需要主动的先创建userDao,然后再创建userService。
但是再Ioc 中我们通过配置让程序自动将创建userDao注入到UserService中。
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后, 把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活 。
Ioc 配置的三种方式
1、xml 配置
顾名思义,就是将bean的信息配置.xml文件里,通过Spring加载文件为我们创建bean。这种方式出现很多早前的SSM项目中,将第三方类库或者一些配置工具类都以这种方式进行配置,主要原因是由于第三方类不支持Spring注解。
举例 :
2、Java 配置
将类的创建交给我们配置的JavcConfig类来完成,Spring只负责维护和管理,采用纯Java创建方式。其本质上就是把在XML上的配置声明转移到Java配置类中
举例 :
3、注解配置
通过在类上加注解的方式,来声明一个类交给Spring管理,Spring会自动扫描带有@component,@controller,@service,@repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。
举例 :
<context:component-scan base-package='tech.duoduo.springframework'>
, 或者@ComponentScan("tech.duoduo.springframework")
注解,或者new AnnotationConfigApplicationContext("tech.duoduo.springframework")
指定扫描的basePackage.依赖注入的三种方式
常用的注入方式主要有三种:构造方法注入(Construct注入),setter注入,基于注解的注入(接口注入)
1、setter方式
在XML配置方式中 ,property都是setter方式注入,比如下面的xml:
本质上包含两步:
所以对应的service类是这样的:
在注解和Java配置方式下
这种方式比较麻烦,所以在Spring4.x版本中推荐构造函数注入。
2、构造函数
在XML配置方式中 ,
<constructor-arg>
是通过构造函数参数注入,比如下面的xml:本质上是new UserServiceImpl(userDao)创建对象, 所以对应的service类是这样的:
在注解和Java配置方式下
3、注解注入
以@Autowired(自动注入)注解注入为例,修饰符有三个属性:Constructor,byType,byName。默认按照byType注入。
比如:
推荐构造器注入方式
构造器注入的方式 能够保证注入的组件不可变,并且确保需要的依赖不为空 。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态。
The text was updated successfully, but these errors were encountered: