目录
一、基本含义
什么是loc?
为什么要使用Spring框架?
ssh框架的整体作用分别为:
二、提供三种注入方式
1接口注入
2设值注入
3构造参数注入
三、Spring实例操作流程
配置:导包
配置文件:applicationContext.xml
定义注入依赖的类:
Test2:值注入
定义注入依赖的类:
配置文件:
测试类:
Test3:构造注入
定义注入依赖的接口:
实现类Teacher和SwimmingTeachService:
配置文件:
Test:
Test4:setter注入
定义注入依赖的类Student:
配置spring设定文件:
测试类不变。
Spring框架主要降低程序的耦合性,耦合性的意思为实现接口和实现类之间的关联性,Spring框架用的实现类是利用配置文件配置进去。Spring引领了javaEE的方向是一种轻量级J2EE应用开发框架。
主要构成:依赖注入容器 和AOP实现。
在学习了三个框架之后Struts2,Hibernate框架分别是对视图层和直流层的操作,而Spring框架负责将两个框架的内容进行配置。
Inversion of Control。控制反转,指的是将传统编程方式中的程序依赖关系的控制钱从程序内部转移到程序外部,运行程序员从程序逻辑中分离出对具体实现的依赖和管理,修改依赖关系只需要修改配置文件。将代码中的控制实例方法转移到程序外面。
改变实现类的时候,如果在实现接口的实现类中多次更改,会使编译器多次编译多个class文件,现在将依赖关系加入配置文件,只需要生成一个class文件,配置文件中提供什么实现类就用什么实现类。
Struts:
Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,是一种基于MVC模式的,就是模式—视图—控制器的编程框架,起到辅助编程设计的作用,将java程序分成了JavaBean, servlet, JavaAction, JSP.
Hibernate:
Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
Spring:
Spring提供了一个用标准Java语言编写的AOP框架,还提供了可以和IoC容器集成的强大而灵活的MVC Web框架。它的IOC思想和AOP思想解决了类与类之间的强偶合问题。
struts主要负责表示层的显示
spring利用它的IOC和AOP来处理控制业务(负责对数据库的操作)
hibernate主要是数据的持久化到数据库
方法调用者通过方法参数提供一个接口的实现类
public class DemoAction{
public void execute(PersonLogic person){
system.out.println(person.sayHello());
}
}
调用方法时从外部注入所以来的组件
DemoAction action=nwe DemoAction();
PersonLogic person =nwe PersonLogicEnImpl();
action.execute(person);
借助javaBean设计方法,把业务处理对象所依赖的其他组件通过setter方法传递进来。
public class Teacher implements Person {
private TeachService service;
public Teacher(TeachService service) {
super();
this.service = service;
}
@Override
public String sayHello() {
// TODO Auto-generated method stub
return "Hello,I am a teacher";
}
@Override
public String provideTeachingService() {
// TODO Auto-generated method stub
return service.provideTeachingService();
}
/**
* 使用构造注入/serrer方法/java注解
*/
public TeachService getService() {
return service;
}
public void setService(TeachService service) {
this.service = service;
}
}
在业务处理对象初始化的阶段,就将所依赖的其他组件通过构造方法设置好,在初始化阶段完成之后,就可以直接得到一个完整的业务对象直接使用。
public class Student implements Person{
private TeachService teachingService;
public Student(){
System.out.println("学生的构造方法");
}
@Override
public String sayHello() {
// TODO Auto-generated method stub
return "你好,我是学生";
}
@Override
public String provideTeachingService() {
// TODO Auto-generated method stub
return "我们一起学猫叫";
}
public TeachService getTeachingService() {
return teachingService;
}
public void setTeachingService(TeachService teachingService) {
this.teachingService = teachingService;
}
}
将beans.xml文件的xml导入类似于在xml文件中创建bean对象。
缺少提示需要找xsd文件,找到spring-beans.xsd文件导入到web-inf,和导入dtd方法相同,将url更改为Namespaces name选项
书写接口。
Test1:常规接口注入
public interface Ifruit {
public void eat();
}
package com.it.spring;
public class Apple implements Ifruit {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃苹果");
}
}
package com.it.spring;
public class Banana implements Ifruit {
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("吃香蕉");
}
}
第一种我们的常规方法是在测试类中实例化一个Apple,实现一个向下转型:
Ifruit fruit=new Apple();
fruit.eat();
我们使用spring框架主要在配置文件applicationContext.xml文件中将所要使用到的Bean加入到配置文件当中:
"fruit" class="com.it.spring.Apple">
将需要的调用的实体类的地址写入class中,再设置name,name在Test中调用。
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Ifruit fruit=(Ifruit)ac.getBean("fruit");
fruit.eat();
即可在只编译一次就可以将结果完成,如果要修改实体类配置文件中需改路径即可。这就是Spring框架的核心思想,配置文件向java编译器传什么值就执行什么,将想要改变的实体从java文件内部拿出来放在xml配置文件中,大大降低了程序的耦合性。
package com.it.spring2;
public class Sing {
private Song song;
public Song getSong() {
return song;
}
public void setSong(Song song) {
this.song = song;
}
public void startSing() {
System.out.println("唱了一首"+song.getSongName());
}
}
package com.it.spring2;
public class Song {
private String songName;
public String getSongName() {
return songName;
}
public void setSongName(String songName) {
this.songName = songName;
}
}
注:上面property中的value为歌曲名称,下面ref中表示sing类中传入的值为song1的value。意思将唱歌动作和唱歌内容两个方法通过配置文件中的property进行关联。
public class Test {
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Sing sing=(Sing)ac.getBean("sing");
sing.startSing();
}
}
这个程序中使用到了第二种方式:设值注入,唱歌的内容songName通过set方法进行传递。
package com.it.spring3;
public interface Person {
public String sayHello();
public String provideTeachingService();
}
package com.it.spring3;
public interface TeachService {
public String provideTeachingService();
}
package com.it.spring3;
public class Teacher implements Person {
private TeachService service;
public Teacher(TeachService service) {
super();
this.service = service;
}
@Override
public String sayHello() {
// TODO Auto-generated method stub
return "Hello,I am a teacher";
}
@Override
public String provideTeachingService() {
// TODO Auto-generated method stub
return service.provideTeachingService();
}
public TeachService getService() {
return service;
}
public void setService(TeachService service) {
this.service = service;
}
}
package com.it.spring3;
public class SwimmingTeachService implements TeachService{
@Override
public String provideTeachingService() {
// TODO Auto-generated method stub
return "I provide service of teaching swimming";
}
}
构造注入要是用constructor-arg的标签。
public static void main(String[] args) {
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
Person person=(Person)ac.getBean("thePerson",Person.class);
System.out.println(person.sayHello());
System.out.println(person.provideTeachingService());
}
本例使用了构造注入的注入方式,主要代码在Teacher实现类中的构造方法中进行实现。
注意事项 | 详细 |
no1 | setter方法需要有缺省的构造方法 |
no2 | set函数的变量名的大小写规范 |
package com.it.spring3;
public class Student implements Person{
private TeachService teachingService;
public Student(){
System.out.println("学生的构造方法");
}
@Override
public String sayHello() {
// TODO Auto-generated method stub
return "你好,我是学生";
}
@Override
public String provideTeachingService() {
// TODO Auto-generated method stub
return "我们一起学猫叫";
}
public TeachService getTeachingService() {
return teachingService;
}
public void setTeachingService(TeachService teachingService) {
this.teachingService = teachingService;
}
}
注意事项 | 详细 |
no1 | ref和bean id的一致 |
no2 | property name和setter对象的一致 |
- 七月 31, 2018 11:13:28 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
- 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@421faab1: startup date [Tue Jul 31 11:13:28 CST 2018]; root of context hierarchy
- 七月 31, 2018 11:13:28 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
- 信息: Loading XML bean definitions from class path resource [applicationContext.xml]
- 七月 31, 2018 11:13:29 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
- 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1554909b: defining beans [fruit,song1,sing,thePerson,theService]; root of factory hierarchy
- 学生的构造方法
- 你好,我是学生
- 我们一起学猫叫