一、准备工作
1、工具Eclipse和IDEA均可以,jdk,Tomcat都准备好。
2、Spring的jar下载地址:
https://repo.spring.io/libs-release-local/org/springframework/spring/
3、Apache Commons系列jar包下载地址:
4、JSTL库包
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
5、Jackson开源包
https://mvnrepository.com/artifact/com.fasterxml.jackson.core
用到哪些包,就在这些网址里找到下载即可,后续用在其他再补充。
二、入门Hello World
创建一个JEE项目(IDEA创建项目,新手建议采用Maven模式,可以直接使用,Gradle有个小坑,需要配置),在webapp——>WEB-INF文件夹下,创建一个lib文件夹,找到上述jar包,导入。
注:这里补充IDEA和Eclipse导入jar的方法
IDEA:
将jar粘贴到lib,然后右键lib,选择一个Add as Library选项,完成。
Eclipse:
将jar粘贴到lib,就能用了。
Spring的特点就是分层,让代码更清晰,管理方便,这里有必要解释一些常用字符串:
常用包名:service是业务逻辑层,dao是数据访问层,controller是控制器层,config是web、spring等配置类的包、pojo是普通JavaBeans。
注:pojo包中的类,只含有一些成员变量和关于这些成员变量的setter和getter方法,不含任何业务逻辑处理。
进入正题,在项目的Java文件夹部分,创建如下包和类文件:(代码中第一行有包名,这里就不在赘述每个代码在哪个包了)
package dao;
public interface TestDao {
public void sayHello();
}
package dao;
public class TestDaoImpl implements TestDao{
@Override
public void sayHello() {
System.out.println("Hello World");
}
}
创建配置文件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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="test" class="dao.TestDaoImpl"/>
</beans>
创建测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import dao.TestDao;
public class Test {
public static void main(String[] args) {
//初始化spring 容器
@SuppressWarnings("resource")
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
TestDao tt=(TestDao)appCon.getBean("test");
tt.sayHello();
}
}
运行Test类,结果输出:
Hello World
原理:读取配置文件,会按照里面的每一个<bean>对应创建一个实例保存在Spring容器中,通过getBean(名字)拿到该实例对象,进行工作。这里使用接口对象来接收接口的子类对象,如果用TestDaoImpl对象来接收,结果也是一样的,但该这里尽量采用这样写法,原因比较复杂,感兴趣可以自行搜索,我理解的是,如果TestDaoImpl实现了多个接口,就如同用户在网站上查看个人信息,没必要直接把数据库的表中所有用户信息都给他展示出来。通过一些方法只显示该用户自己的信息即可。当然原因不一定是这样。
三、Spring框架配置方法
1、xml配置
上述Hello World的例子用了XML配置Bean的方法,但是当你项目中需要大量Bean时,你想要修改一个类名,除了修改该类名以外,你还要跑到XML文件中,ctrl+F找到对应的原类名进行修改。当然这只是一种情况,XML配置不利于以后项目的升级维护。
2、Java配置
因此,现在更推荐用注解的方式,实现装配Bean。
声明Bean的注解:
@Component | 普通标识Bean,任何类,没有明确的功能分配 |
@Repository | 用于dao数据访问层标识为Bean,功能和@Component一样 |
@Service | 用于service业务逻辑层标识为Bean,功能和@Component一样 |
@Controller | 用于controller控制器层标识为Bean,功能和@Component一样 |
注入Bean的注解(比如,在类中声明一个成员Object ob,不用进行实例化,Spring容器会先找自身有没有ob,没有创建一个,有就取出来,赋予当前ob)
@Autowired | 功能为上方解释,如果使用某些实例对象,不在需要用get,set等方法,通过该注解,直接将实例对象,赋予当前成员变量。按照Bean类型进行装配 |
@Resource | 与@Autowired功能一样,区别在于,按照名称来装配注入。 |
@Qualifier | 当需要按名称来装配Bean配合@Autowired一起用,此注解用来指定名称。 |
3、使用Java配置的样例
package annotation.dao;
public interface TestDao {
public void save();
}
package annotation.dao;
import org.springframework.stereotype.Repository;
@Repository("testDaoImpl")
public class TestDaoImpl implements TestDao{
@Override
public void save() {
System.out.println("testDao save");
}
}
package annotation.service;
public interface TestService {
public void save();
}
package annotation.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import annotation.dao.TestDao;
@Service("testServiceImpl")
public class TestServiceImpl implements TestService{
@Resource(name="testDaoImpl")
private TestDao testDao;
@Override
public void save() {
// TODO Auto-generated method stub
testDao.save();
System.out.println("testService save");
}
}
package annotation.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import annotation.service.TestService;
@Controller
public class TestController {
@Autowired
private TestService testService;
public void save() {
testService.save();
System.out.println("testController save");
}
}
package annotation;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("annotation")
public class ConfigAnnotation {
}
测试类:
package annotation;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import annotation.controller.TestController;
public class TestAnnotation {
public static void main(String[] args) {
// TODO Auto-generated method stub
AnnotationConfigApplicationContext appCon = new AnnotationConfigApplicationContext(ConfigAnnotation.class);
TestController tc = appCon.getBean(TestController.class);
tc.save();
appCon.close();
}
}