spring 学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试
spring学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试
ioc 概念
控制反转(Inversion of Control,缩写为IOC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
IOC和DI区别
- IOC: 控制反转,把对象创建交给spring进行配置
- DI: 依赖注入,向类里面的属性中设置值
- 关系:依赖注入不能单独存在,需要在ioc基础之上完成操作
创建 spring 实例进行 ioc 测试
我们使用 intellijIDEA 来完成这一操作,首先创建 maven 工程(maven提供了 java 中 jar 包的下载管理,方便我们使用下载和导入 jar 包,推荐使用)。打开 idea,选择 Create New Project, 在弹出来的窗口中选择创建 maven 工程,设置好 JDK 后点击 next 进行下一步。

设置好 GrouId、ArtifactId、Version 后,按提示一路设置创建好 maven 项目。

我们修改 pom.xml 设置,配置需要添加下载的 jar 包:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
当我们修改pom.xml 文件时,idea 会提示我们导入,我们点击 Import Change即可,当然也可以设置Auto-Import自动导入:

我们在 src/main/java 下新建一个 package:cn.itcast.ioc, 并在 package 下新建 User.java:
package cn.itcast.ioc;
public class User {
public void add(){
System.out.println("add......");
}
//public static void main(String[] args) {
//原始做法
//User user = new User();
//user.add();
//}
}
在 resources目录下新建 applicationContext.xml 配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- scheme约束 -->
<beans xmlns="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">
<!-- ioc 入门 -->
<bean id="user" class="cn.itcast.ioc.User"></bean>
</beans>
然后在 src/main/java 下创建测试文件 TestIOC.java ,尝试能否通过装载 bean,交由 spring 创建对象,通过配置文件输出 ioc 实例:
package cn.itcast.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIOC {
@Test
public void testUser(){
//1.加载 spring 配置文件,根据创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.得到配置创建的对象
User user = (User) context.getBean("user");
user.add();
}
}
运行 TestIOC.java , 若控制台能输出 add() 方法,便测试成功。

通过配置文件注入属性
介绍:创建对象时候,向类里面属性设置值。
在 spring 中我们一般采用通过set 方法注入。
举个栗子:
在 src/main/java/ 下创建 UserService.java:
package cn.itcast.ioc;
public class UserService {
//1 定义 user 类型
private User user;
//2 生成set 方法
public void setUser(User user) {
this.user = user;
}
public void add(){
System.out.println("service....");
user.add();
}
}
修改 applicationContext.xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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">
<!-- 注入对象类型 -->
<!-- 配置 service 和 user 对象 -->
<bean id="user" class="cn.itcast.ioc.User"></bean>
<bean id="userService" class="cn.itcast.ioc.UserService">
<!-- 注入 user 对象
name 属性值, service 类里面的属性名称
ref 属性, 配置bean 标签中 id 值
-->
<property name="user" ref="user"></property>
</bean>
</beans>
修改 TestIOC.java:
package cn.itcast.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIOC {
@Test
public void testUser(){
//1.加载 spring 配置文件,根据创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.得到配置创建的对象
UserService userService = (UserService) context.getBean("userService");
userService.add();
}
}
成功在控制台输出 UserService类的 add() 方法和注入的属性:

通过注解创建 ioc 实例
上述实例是通过配置 xml 文件来实现创建对象的功能,spring 也提供了另一种方式来实现上述功能:注解。
注解介绍
- 代码里面特殊标记,使用注解可以完成功能
- 注解写法 @注解名称(属性名称=属性值)
- 注解使用在类上面,方法上面和属性上面
创建对象的四个注解
- @Component
- @Controller
- @Service
- @Repository
主要是通过 Component 衍生出 其他三个在web 层、业务层、持久层注解,主要是为了后续增强。但对我来说这四个注解功能目前来说是一样的,都是创建对象。
我们重新配置一下 applicationContext.xml 文件,引入新的约束,开启注解扫描:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean definitions here -->
<!-- 开启注解扫描
(1) 到包里面扫描类,方法,属性上面是否有注解
-->
<context:component-scan base-package="cn.itcast.ioc"></context:component-scan>
<!-- 扫描属性上面的注解 -->
<!--<context:annotation-config></context:annotation-config>-->
</beans>
修改 User.java 文件:
package cn.itcast.ioc;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
@Service(value = "user") //相当于<bean id="user" class=""/>
@Scope(value = "prototype") //多实例
public class User {
public void add(){
System.out.println("add........");
}
}
修改TestIOC.java:
package cn.itcast.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIOC {
@Test
public void testUser(){
//1.加载 spring 配置文件,根据创建对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.得到配置创建的对象,这里的getBean()方法中的 user 为User类通过注解的 value 值。
User user = (User) context.getBean("user");
user.add();
}
}
控制台成功输入User 类的 add()方法:

通过注解注入属性
同样的,我们可以通过使用注解注入属性。
这里有两种方式,我们可以通过使用 @Autowired(自动注入)或 @Resource(name="value")(name属性值:注解创建对象 value 值),推荐使用后一种。
注:使用注解不需要 set 方法。
还是举个栗子:
在 src/main/java/ 下创建 package 和 UserDao.java 和 UserService.java。
UserDao.java:
package cn.itcast.anno;
import org.springframework.stereotype.Service;
@Service(value = "userDao")
public class UserDao {
public void add(){
System.out.println("dao.........");
}
}
UserService.java:
package cn.itcast.anno;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service(value = "userService")
public class UserService {
//得到dao 对象
//定义 dao 类型
//方法一:在 dao属性上面使用注解,完成对象注入
// @Autowired
// private UserDao userDao;
//使用注解不需要set 方法
//方法二:
//name属性值: 注解创建 dao对象 value 值
@Resource(name = "userDao")
private UserDao userDao;
public void add(){
System.out.println("service.......");
userDao.add();
}
}
使用上述 applicationContext.xml 中的注解配置,创建 TestAnno.java:
package cn.itcast.anno;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAnno {
@Test
public void TestService(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) context.getBean("userService");
userService.add();
}
}
运行 TestAnno.java ,控制台输出如下信息:

总结:
- 通过 spring框架的 ioc 容器,我们可以把对象的创建交给 spring 进行,降低代码的耦合度。
- 在 spring 框架 ioc 容器装配 bean,可以通过配置 xml 文件和注解两种方式进行管理。
- 掌握注入属性的两种方式:配置 xml 文件和注解。
- 先创建对象,再注入属性。
spring 学习(一):使用 intellijIDEA 创建 maven 工程进行 Spring ioc 测试的更多相关文章
- Maven 工程下 Spring MVC 站点配置 (三) C3P0连接池与@Autowired的应用
Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 前两篇文章主要是对站点和数据库操作配置进行了演示,如果单 ...
- Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作
详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...
- Maven 工程下 Spring MVC 站点配置 (一)
最近,查找一些具体资料时,虽然会有很多,但是系统的却很少,尤其是对maven 下 spring mvc 站点搭建的配置,总是说的很多但让新手一目了然的步骤却少之又少. 对此闲暇时整理了一下,做了一套较 ...
- Eclipse创建Maven工程报错
问题 用Eclipse创建maven工程的时候,总是会报错,例如提示: Unable to create project from archetype [org.apache.maven.archet ...
- MyEclipse创建Maven工程
先要在MyEclipse中对Maven进行设置:
- Myeclipse中创建Maven工程的时候没有 webapp-javaee6
1. http://mvnrepository.com/artifact/org.codehaus.mojo.archetypes/webapp-javaee6/1.5 中有描述
- MyEclipse中创建maven工程
转载:http://blog.sina.com.cn/s/blog_4f925fc30102epdv.html 先要在MyEclipse中对Maven进行设置: 到此Maven对MyEclip ...
- 篇一:eclipse创建maven工程
一.概览 maven创建的项目主要分为三类:war(网页工程).jar(Java工程).pom(父工程); war:网页工程,包含webapp,用于view层 jar:Java工程,用于提供方法.se ...
- Eclipse创建Maven工程
Eclipse创建Maven工程: Eclipse: New -> Other -> Maven Project -> Next -> webapp -> Finish ...
随机推荐
- 使用airmon-ng工具开启监听模式
使用ifconfig命令查看活动的网络接口 可以看出网卡已经激活了,然后将网卡设置为混杂模式 root@sch01ar:~# airmon-ng start wlan0 用ifconfig查看网卡是否 ...
- in not in 和 null , in 判断范围中可以包含null,而not in判断不能包括null
oracle中,任何字符串与null比较得到的结果都是null,而 oracle的判断条件为null时就退出判断(?) 因此判断某个字符串是否在一个集合中时,not in 和 in的结果完全不一样,如 ...
- ffmpeg个人翻译文档1-8<转>
[个人翻译]ffmpeg文档1 (2008-08-26 09:39:15) 转载 标签: 杂谈 分类: 翻译文档 指导1:制作屏幕录像 源代码:tutorial01.c 概要 电影文件有很多基本的 ...
- linux进行Java开发环境的部署
一.前言: 今天正式向linux开发进攻了,其中遇到一些问题简单的记录一下,为之后的再次部署提供方便. 二.linux的Java8安装的两种方法: 1.源安装很简单,一个命令搞定. sudo apt- ...
- 【原创】13. MYSQL++之SSQLS(基本用法篇)
1. 综述 终于来到了SSQLS( Specialized SQL Structure),照我看来这是一个很类似于Hibernate的功能.也就是说,通过SSQLS可以将一张表完全对应到一个C++结构 ...
- codeforces:Roads in the Kingdom分析和实现
题目大意:国家有n个城市,还有n条道路,每条道路连通两个不同的城市,n条道路使得所有n个城市相互连通.现在国家经费不足,要关闭一条道路.国家的不便度定义为国家中任意两个不同的城市之间的距离的最大值,那 ...
- 面试题--CVTE
2.HashMap和HashSet的实现原理,hashset 和hashMap区别 HashSet底层就是HashMap实现的, *HashMap* *HashSet* HashMap实现了Map接口 ...
- 使用mail架包发送邮件javax.mail.AuthenticationFailedException: failed to connect at javax.mail.Service.connec
这个错误是因为连接不上邮箱服务器导致的,可能有以下几个原因(以网易邮箱为例) 1.当使用第三方登录邮箱时需要有邮箱的授权码,且要开启POP3/SMTP/IMAP:服务 2.在代码中要调用网易邮箱的密码 ...
- ESP8266-iot-3
ESP8266 WIFI操作 参考资料 模式选择 程序: 把之前的Helloworld程序复制过来改成wifi工程 先输出获取的当前模式 编译后会出错,因为os_printf的头文件没有被包含进来 结 ...
- 现代C++学习笔记之二入门篇2,数据转换
static_cast: 这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换, ...