Spring学习使用标签来标记资源(@Component、@Repository、 @Service和@Controller)和用法(包括如何jsp正在使用)

首先,在xml其中新增部分标有下划线的文件,容器初始化的时候需要扫描包

 注意:

a.     包款扫描(下划线部分)一定要加,默认是不扫描整个包。与每一包之间’,’开。如过具有同样的父包,那么我们能够用父包来取代。例如以下划线部分,我们能够用com.bjsxt来取代。

<?

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-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config /><!-- 自己主动装配一定要 加上此片段--> <context:component-scan base-package="com.bjsxt.dao.impl,com.bjsxt.service,com.bjsxt.model"></context:component-scan> </beans>



b.     在2.5版本号中(@Component@Repository@Service@Controller)四个标签代表同样的含义,以后的版本号中可能会有差别。

c.    在标注组件等资源时候,尽量加上名称比如@Component("stuDaoImpl")

默认的名称是 类名首字母小写。

<pre name="code" class="java">package com.bjsxt.dao.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
import com.bjsxt.dao.*;
import com.bjsxt.model.Student;
@Component("stuDaoImpl")
public class StudentDaoImpl implements StudentDao{
	@Override
	public void StudentSave(Student s) {
          System.out.println("学生被保存!");
		
	}
}


d.      用法 在set方法或者属性名前增加 @resource(name="stuDaoImpl"),推荐增加名称,默认是依照类型进行查找。比如:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import com.bjsxt.dao.*;
import com.bjsxt.dao.impl.*;
import com.bjsxt.model.*;
@Component("studentService")//声明资源
public class StudentService {
private StudentDao studentDao;
public StudentDao getStudentDao() {
	return studentDao;
}
@Resource(name="stuDaoImpl")//注入
public void setStudentDao(StudentDao studentDao) {
	this.studentDao = studentDao;
}
public void add(Student s)
{
	this.studentDao.StudentSave(s);
}

e.測试方式依旧和之前的注入方式一样,注意这里的

Studentstudent=(Student)ctx.getBean("student");是我们用标签在student类中声明的@Component("student")。

Spring容器会能通过ctx(相当于beanFactory)找到。

package com.bjsxt.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bjsxt.model.Student;

public class StudentServiceTest {

	@Test
	public void test() {
		System.out.println("程序执行之前....");
		ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
		System.out.println("程序执行開始....");
		StudentService sService=(StudentService)ctx.getBean("studentService");
		
		Student student=(Student)ctx.getBean("student");
		Student student2=(Student)ctx.getBean("student");
		System.out.println(student2==student);
		sService.add(student);
	}
}

f.   在jsp页面须要处理业务,有java代码须要spring注入service。

须要如今想要获取的类前加标签

@Component("docrelationService")首先jsp页面导入

<%@page import="org.springframework.context.ApplicationContext"%>
<%@pageimport="org.springframework.web.context.support.WebApplicationContextUtils"%>

获取spring注入

<%
        ApplicationContext context =WebApplicationContextUtils
             .getWebApplicationContext(application);

           DocrelationServicedocrelationService = (DocrelationService) context
             .getBean("docrelationService");

%>

g.  

 假如类Aspring容器管理,在类B中引用A,假设想在B中的A是由spring容器创建的,有两种方法:

     a).B也由spring容器管理(即类B前有@compoment(b)标签),并注入A,BeanFactory.getBean("b") 得到B实例,就可以(推荐).

     b).B不由spring容器管理,在类B中用代码 (ABeanFactory.getBean("a")得到A实例,就可以.(不推荐,会产生两个beanFactory由于在类B中须要用BeanFactory,所以我们必须在Bnew一个)

c)B创建实例时候假设採用a)方法,决不能採用B b=new B();的方式,否则会报nullpoint异常。

d)ClassPathXmlApplicationContext建立在beanFactory基础之上,非常少有人直接使用。

測试代码:

package com.bjsxt.service;

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bjsxt.model.Student;

public class StudentServiceTest {

	@Test
	public void test() {
		System.out.println("程序执行之前....");
		//BeanFactory ctx=new ClassPathXmlApplicationContext("beans.xml");
		//ClassPathXmlApplicationContext建立在beanFactory基础之上,非常少有人直接使用。

ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");//直接获取spring容器 System.out.println("程序执行開始...."); StudentService sService=(StudentService)ctx.getBean("studentService");//StudentService相当于类B //StudentService sService=new StudentService(); Student student=(Student)ctx.getBean("student"); Student student2=(Student)ctx.getBean("student"); System.out.println(student2==student); sService.add(student); } }





版权声明:本文博客原创文章,博客,未经同意,不得转载。

原文地址:https://www.cnblogs.com/zfyouxi/p/4640478.html