Spring实现依赖注入有两种方法
对于基于配置文件方法,步骤为:
导包
在项目右键-》new-》Spring Bean Configuration File
生成Spring配置文件
编写配置文件。
在配置文件中注册组件(bean),添加组建依赖
对于基于注解方法,步骤为:
导包
在项目右键-》new-》Spring Bean Configuration File
生成Spring配置文件
编写配置文:配置注解扫描包
在需要的地方添加注解
接下来先介绍基于配置文件的方式:
使用Spring的配置文件实现依赖注入有两种方法
首先介绍最基本的注入,对Spring的实现的依赖注入有个了解
假设我想在测试方法中调用NewsDao
的save方法,我们不使用new方法实例化NewsDao,使用依赖注入的方法在测试方法中注入NewsDao
首先我们需要在Spring的配置文件中注册NewsDao
<bean id="newsDao" class="spring.dao.NewsDao">bean>
这里注册一个名字叫"newsDao",类型为"spring.dao.NewsDao"的组件,这个就相当于
NewsDao newsDao;
在测试方法中,我们通过Spring的配置文件获取上下文(ApplicationContext),根据上下文注入名为"newsDao"的实例
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
//寻找配置文件中名为"newsDao"的bean,根据bean中的calss属性来注入实例
NewsDao newsDao = (NewsDao) ac.getBean("newsDao");
newsDao.save();
}
测试结果如下:
首先,使用set方法注入,要求被注入的类要有相应的set方法,还是采用上一节的例子进行说明:这里要在NewsService
中注入NewsDao
。
首先在NewsService
中添加newsDao
属性的set方法
public class NewsService {
private NewsDao newsDao;
public void setNewsDao(NewsDao newsDao) {
this.newsDao = newsDao;
}
public void save() {
System.out.println("NewsService保存操作");
newsDao.save();
}
}
然后在Spring配置文件中注册newsService
,并且告诉Spring,在newsService
里还需要注入newsDao
<bean id="newsDao" class="spring.dao.NewsDao">bean>
<bean id="newsService" class="spring.service.NewsService">
<property name="newsDao" ref="newsDao">property>
bean>
property标签表示使用set方法注入,要将实例注入到newsDao的属性里,其中:
name表示要注入的属性名,ref中填写要注入的实例的id
测试方法如下:
只需要注入newService实例就可以了,不需要再注入newsDao,Spring会根据配置文件自动往newService中注入newsDao
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
NewsService newsService = (NewsService) ac.getBean("newsService");
newsService.save();
}
测试结果如下:
这个方法不常用,常用的其实是set注入
基于构造器注入要求被注入的类必须有相应的构造器
假设这里我们需要注入一个初始值为id=1,title="测试标题"
的news
,配置文件如下:
<bean id="news" class="spring.pojo.News">
<constructor-arg name="id" value="1">constructor-arg>
<constructor-arg name="title" value="测试标题">constructor-arg>
bean>
其中constructor-arg
表示使用构造器注入,注意到,这里用的是value而不是ref
这两的区别在于
value用于基本类型
ref用于对象类型
在Spring配置文件中打开注解扫描,由于我的包都是spring开头,因此这里的包名为spring
<context:component-scan base-package="spring">context:component-scan>
使用注解将类注册到Spring中
常用的注解包括
@Component 通用注解
将一个类交给Spring管理时的通用注解,相当于
<bean name="" class="">
的注册
@Repository 数据持久层注解
@Service 业务层注解
@Controller 控制器注解
其中,@Component和后面三个本质上没有区别,区别在于后三者是更规范的写法
@Repository
public class NewsDao {
public void save() {
System.out.println("NewsDao保存操作");
}
}
@Autowired 自动注入(常用)
先按照类型注入如果没有,再检查名称注入
@Resource Javax的支持注入
先检查名称注入,在检查类型注入
@Qualifier(“名字”)要和@Autowired一起使用
标识名称是Spring在容器中自动指定的,指定的名字是驼峰命名法
@Service
public class NewsService {
@Autowired
@Qualifier("newsDao")
private NewsDao newsDao;
//...忽略其他
}