Spring框架入门(一)简介及三种基本注入方式实例

目录

一、基本含义

什么是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框架负责将两个框架的内容进行配置。

什么是loc?

Inversion of Control。控制反转,指的是将传统编程方式中的程序依赖关系的控制钱从程序内部转移到程序外部,运行程序员从程序逻辑中分离出对具体实现的依赖和管理,修改依赖关系只需要修改配置文件。将代码中的控制实例方法转移到程序外面。

为什么要使用Spring框架?

改变实现类的时候,如果在实现接口的实现类中多次更改,会使编译器多次编译多个class文件,现在将依赖关系加入配置文件,只需要生成一个class文件,配置文件中提供什么实现类就用什么实现类。

ssh框架的整体作用分别为:

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主要是数据的持久化到数据库


二、提供三种注入方式

1接口注入

方法调用者通过方法参数提供一个接口的实现类

public class DemoAction{

public void execute(PersonLogic person){

system.out.println(person.sayHello());

}

}

调用方法时从外部注入所以来的组件



DemoAction action=nwe DemoAction();

PersonLogic person =nwe PersonLogicEnImpl();

action.execute(person);

2设值注入

借助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;
	}
	
}

3构造参数注入

在业务处理对象初始化的阶段,就将所依赖的其他组件通过构造方法设置好,在初始化阶段完成之后,就可以直接得到一个完整的业务对象直接使用。

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;
	}

}

三、Spring实例操作流程

配置:导包

配置文件:applicationContext.xml

将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加入到配置文件当中:

<bean id="fruit" class="com.it.spring.Apple"></bean>

将需要的调用的实体类的地址写入class中,再设置name,name在Test中调用。

ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");

          Ifruit fruit=(Ifruit)ac.getBean("fruit");

          fruit.eat();

即可在只编译一次就可以将结果完成,如果要修改实体类配置文件中需改路径即可。这就是Spring框架的核心思想,配置文件向java编译器传什么值就执行什么,将想要改变的实体从java文件内部拿出来放在xml配置文件中,大大降低了程序的耦合性。


Test2:值注入

定义注入依赖的类:

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;

     }
     

}

配置文件:

<bean id="song1"  class="com.it.spring2.Song">

  <property name="songName" value="莉莉安"></property>

  </bean>

  <bean id="sing" class="com.it.spring2.Sing">

  <property name="song" ref="song1"></property>

  </bean>

注:上面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方法进行传递。


Test3:构造注入

定义注入依赖的接口:

package com.it.spring3;

public interface Person {

		public String sayHello();
		public String provideTeachingService();
}
package com.it.spring3;

public interface TeachService {

	
		public String provideTeachingService();
}

实现类Teacher和SwimmingTeachService:

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的标签。

<bean id="thePerson"  class="com.it.spring3.Teacher">
  <constructor-arg ref="theService1"></constructor-arg>
  </bean>
  <bean id="theService1" class="com.it.spring3.SwimmingTeachService"></bean>

Test:

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实现类中的构造方法中进行实现。


Test4:setter注入

定义注入依赖的类Student:

注意事项详细
no1setter方法需要有缺省的构造方法
no2set函数的变量名的大小写规范
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;
	}

}

配置spring设定文件:

注意事项详细
no1ref和bean id的一致
no2property name和setter对象的一致
 <bean  id="thePerson" class="com.it.spring3.Student">
 <property name="teachingService" ref="theService"></property>
 </bean>
  <bean id="theService" class="com.it.spring3.SwimmingTeachService"></bean>

测试类不变。

  1. 七月 31, 2018 11:13:28 上午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
     
  2. 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@421faab1: startup date [Tue Jul 31 11:13:28 CST 2018]; root of context hierarchy
  3. 七月 31, 2018 11:13:28 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
  4. 信息: Loading XML bean definitions from class path resource [applicationContext.xml]
  5. 七月 31, 2018 11:13:29 上午 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
  6. 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1554909b: defining beans [fruit,song1,sing,thePerson,theService]; root of factory hierarchy
  7. 学生的构造方法
  8. 你好,我是学生
  9. 我们一起学猫叫
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值