Spring(注解+依赖注入+无配置注解)适合回顾♥♥
Posted 牛牛最爱喝兽奶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring(注解+依赖注入+无配置注解)适合回顾♥♥相关的知识,希望对你有一定的参考价值。
Spring注解
bean 注入与装配的的方式有很多种,可以通过 xml,get set 方式,构造函数或者注解等。简单易
用的方式就是使用 Spring 的注解了,Spring 提供了大量的注解方式。
IOC和DI
在介绍注解之前呢,我先来给大家谈谈IOC(控制反转和依赖注入)。作为Spring核心思想之一的IOC,唯一目的就是降低对象与对象之间的一个耦合度,例如我们平时写的代码,经常将几个对象之间进行嵌套使用,错综复杂管理起来极不方便,所以导致了代码维护困难。如下图:
其实耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。要想降低对象与对象之间的一个耦合度,科学家们提出了IOC控制反转的思想,如下图:
通过IOC容器来过度对象与对象之间的连接关系,若此时去掉IOC容器四个对象就独立出来了。且相互之间毫无联系。控制反转,传统的应用程序中,控制权在程序本身,程序的控制流程完全由开发者控制,这种模式的缺点是,一个组件如果要使用另一个组件,必须先知道如何正确地创建它。在IoC模式下,控制权发生了反转,即从应用程序转移到了IoC容器,所有组件不再由应用程序自己创建和配置,而是由IoC容器负责,这样,应用程序只需要直接使用已经创建好并且配置好的组件。为了能让组件在IoC容器中被“装配”出来,需要某种“注入”机制(DI)。由原来的主动创建,到现在的被动实现,控制权实现了反转,也就叫控制反转。由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
DI: 实际上DI就是LOC的另一个名字,区别不是很大,控制反转要依赖于DI注入,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。 所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,指就是通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
(注入的方式已在另一篇文章介绍DI注入方式)
注解
注解
1.注解的使用
@Controller
@Controller(“Bean的名称”) 定义控制层Bean,如Action
@Service
@Service(“Bean的名称”) 定义业务层Bean
@Repository
@Repository(“Bean的名称”) 定义DAO层Bean
@Component 定义Bean, 不好归类时使用.
可以指定bean的id,默认时类名首字母小写。
@Autowired (Srping提供的)
默认按类型匹配,自动装配(Srping提供的),可以写在成员属性上,或写在setter方法上
@Autowired(required=true)
一定要找到匹配的Bean,否则抛异常。 默认值就是true
@Autowired
@Qualifier("bean的名字")
按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。
@Resource JSR-250提供的
默认按名称装配,当找不到名称匹配的bean再按类型装配.
可以写在成员属性上,或写在setter方法上
可以通过@Resource(name="beanName") 指定被注入的bean的名称, 要是未指定name属性, 默认使用成员属性的变量名,一般不用写name属性.
@Resource(name="beanName")指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了.
@Inject 是JSR-330提供的
按类型装配,功能比@Autowired少,没有使用的必要。
bean配置文件中必须加入以下配置,否则注解不起作用。
<context:component-scan base-package="com.xiaoliu.pojo">
</context:component-scan>
dao层
import org.springframework.stereotype.Repository;
@Repository
public class DaoTest {
public void add(){
System.out.println("Dao_test com on!");
}
}
服务层
@org.springframework.stereotype.Service//将该类交给spring来管理
public class Service {
@Qualifier("daoTest")//指定加载daoTest
@Autowired//根据变量类型赋值
private DaoTest daoTest;
public void add(){
daoTest.add();
System.out.println("service_test hello");
}
}
控制层
@Controller
public class Action {
@Autowired
private Service service;
public void add(){
service.add();
System.out.println("Action come on!");
}
}
测试:
@Test
public void test3(){
ApplicationContext at = new ClassPathXmlApplicationContext("spring-action.xml");
Action a = at.getBean("action",Action.class);//默认id是类名首字母小写
System.out.println(a);
Service s = at.getBean(Service.class);//("service",Service.class)
System.out.println(s);
DaoTest d = at.getBean(DaoTest.class);
System.out.println(d);
a.add();
}
本质上就是将类交给IOC容器进行管理
2.无配置注解
<!--扫描包+注解-->
<context:component-scan base-package="com.xiaoliu"></context:component-scan>
<!--出去控制层注解,-->
<context:component-scan base-package="com.xiaoliu.pojo" use-default-filters="false"><!--只包含必须取消默认-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:component-scan base-package="com.xiaoliu.pojo" ><!--不包含-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
测试案例
1.引入外部文件以及数据库连接池的配置(druid.pool)
<!-- 导入外部文件-->
<context:property-placeholder location="db.properties"></context:property-placeholder>
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="username" value="${jdbc.name}"></property>
</bean>
以上是关于Spring(注解+依赖注入+无配置注解)适合回顾♥♥的主要内容,如果未能解决你的问题,请参考以下文章
Spring中@Autowired@Resource和@Inject注解的使用和区别