spring @Repository 和@Service,@Controller使用方法

spring @Repository 和@Service,@Controller使用方法

Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释;

实际使用中

实例一:@Repository

spring @Repository 和@Service,@Controller使用方法

上图中的application3.xml是配置文件,test2是测试类。其他的不用管;

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:="http://www.springframework.org/schema/beans"
	   xmlns:context="http://www.springframework.org/schema/context"
       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-2.5.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context-2.5.xsd">
            
		 <context:component-scan base-package="com.introduce.Dao"></context:component-scan>
</beans>

配置文件是启动spring容器时扫描com.introduce.Dao所有的注解。


test2测试类

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.introduce.Dao.UserDao;

public class Test2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext3.xml");
		UserDao userDao=ac.getBean(UserDao.class);
		userDao.getUser2("haha");
	}
}

UserDao接口和它的实现类UserDaoImpl

package com.introduce.Dao;


import com.introduce.Model.User2;
public interface UserDao{
	User2 getUser2();

	User2 getUser2(String name);

}
package com.introduce.Dao;

import org.apache.ibatis.session.SqlSession;


import org.apache.ibatis.session.SqlSessionFactory;

import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import com.introduce.Model.User2;
@Service
public class UserDaoImpl implements UserDao{
//	private SqlSessionFactory sqlSessionFactory; 
//	public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
//		this.sqlSessionFactory=sqlSessionFactory;
//	}
	@Override
	public User2 getUser2() {
		
		return null;
	}

	@Override
	public User2 getUser2(String name) {
		// TODO Auto-generated method stub
//		SqlSession sqlSession=sqlSessionFactory.openSession();
//		User2 user2=sqlSession.selectOne("com.introduce.Modle.User2.getUser2",name);
		User2 user2=new User2();
		user2.setAge(22);
		System.out.println(name);
		return  user2;
	}
}


这样在启动后就会打印出user实现类方法的内容。

注:至于注解中@Service()的括号中要不要加字符串,如@Service(“userDao”).这里是加不加,加什么样的字符都无所谓,因为只有一个实现类,当有多个实现类是,也可以不用填,在下面的实例二中,会通过@Qualifier()来指定特定的实现了。如果填了,要保证两个字符串不相等即可。一般项目中安全起见会以实现类名为准,避免重复。

实例二:@Repository 与service一起使用,并当有多个实现类时,如何指定某个实现类。

测试类 main方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.introduce.Dao.UserDao;
import com.introduce.Dao.UserServiceImpl;
import com.introduce.Dao.UserService;

public class Test2 {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext3.xml");
		UserService userService=ac.getBean(UserService.class);
		userService.ff();
//		UserDao userDao=ac.getBean(UserDao.class);
//		userDao.getUser2("haha");
		
	}
}

main方法中找到容器中的userService.class类。

进入到service接口和实现类

package com.introduce.Dao;

public interface UserService {
void ff();
}
package com.introduce.Dao;

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

import com.introduce.Dao.UserDao;
@Service
public class UserServiceImpl implements UserService1{
	@Autowired
	@Qualifier("userDaoImpl2")
	UserDao userDao;
	
	public void ff(){
		userDao.getUser2("oo");
	}

}

在service的实现类中有两点,一是加@Service;二是使用@Qualifier()指定某个实现类。@Qualifier()括号中的字符串某人是实现类的类名首字母小写,当然也可以自己定义,如在实现类的其中一个service(“s1”),另一个service(“s2”);即可。下面的代码是没加的。可以手动加,然后再@Qualifier(‘s2’)就会执行userDaoImpl类的方法。


dao层的三个类,一个接口,两个实现类

package com.introduce.Dao;


import com.introduce.Model.User2;
public interface UserDao{
	User2 getUser2();

	User2 getUser2(String name);

}

package com.introduce.Dao;

import org.apache.ibatis.session.SqlSession;


import org.apache.ibatis.session.SqlSessionFactory;

import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import com.introduce.Model.User2;
@Service
public class UserDaoImpl implements UserDao{
//	private SqlSessionFactory sqlSessionFactory; 
//	public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
//		this.sqlSessionFactory=sqlSessionFactory;
//	}
	@Override
	public User2 getUser2() {
		
		return null;
	}

	@Override
	public User2 getUser2(String name) {
		// TODO Auto-generated method stub
//		SqlSession sqlSession=sqlSessionFactory.openSession();
//		User2 user2=sqlSession.selectOne("com.introduce.Modle.User2.getUser2",name);
		User2 user2=new User2();
		user2.setAge(22);
		System.out.println(name);
		return  user2;
	}
}

package com.introduce.Dao;

import org.springframework.stereotype.Service;

import com.introduce.Model.User2;
@Service
public class UserDaoImpl2 implements UserDao{
	@Override
	public User2 getUser2() {
		
		return null;
	}

	@Override
	public User2 getUser2(String name) {
		// TODO Auto-generated method stub
//		SqlSession sqlSession=sqlSessionFactory.openSession();
//		User2 user2=sqlSession.selectOne("com.introduce.Modle.User2.getUser2",name);
		User2 user2=new User2();
		user2.setAge(22);
		System.out.println(name);
		return  user2;
	}
}


细心的朋友可以看到我的userDaoImpl和userDaoImpl2两个实现类都是使用的@Service。可是程序也能正常执行。如果把@Service换成@Repository程序

也是可以正常执行的。所以二者并没有功能上的差别,只是为了配合spingmvc 三层架构区分开的别名。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/106266.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 程序员即装逼又实用的Cmd命令行

    程序员即装逼又实用的Cmd命令行首先windows键+R(+R)打开运行,输入cmd回车打开命令行。1、cleanmgr选择盘符清理垃圾,能加快电脑运行速度。2、chkdsk磁盘检查,能检查磁盘是否有损害。3、devmgmt打开设备管理器4、dxdiag打开DirectX诊断工具,买二手电脑是避免黑商修改电脑配5、ping:ping192.168.0.1判断某台电脑是否能连…

    2022年5月20日
    73
  • log4j2.xml放在哪里_log4j日志配置详解

    log4j2.xml放在哪里_log4j日志配置详解  一、log4j2介绍  log4j2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为”.xml”,”.json”或者”.jsn”。配置文件的格式:log2j配置文件可以是xml格式的,也可以是json格式的。配置文件的位置:log4j2默认会在classpath目录下寻找log4j2.xml、log4j.json、log4j.jsn等…

    2022年9月30日
    0
  • iscsiadm命令详解_tempadm

    iscsiadm命令详解_tempadm#rpm–ivhiscsi-initiator-utils-6.2.0.742-0.5.el5.i386.rpm在服务器上安装了iSCSIinitiator以及iscsiadmiscsiadm是基于命令行的iscsi管理工具,提供了对iscsi节点、会话、连接以及发现记录的操作。iscsiadm的使用说明可以查看/usr/share/doc/iscsi-init

    2022年8月23日
    3
  • 关于RecyclerView的notifyDataSetChanged

    关于RecyclerView的notifyDataSetChanged在很久以前,总觉得ListView的notifyDataSetChanged之类的方法很神奇,数据更新后,调用一下,视图就变了…不过自从知道观察者模式以后就没感觉么神奇了,反而对View的绘制测量一系列精细的计算叹为观止—虽然从某种程度上来说,Android的源代码其实挺臃肿的。后面推出了RecyclerView,但其实更新机制并无不同。就如调用notifyDataSetChanged方法:…

    2022年6月29日
    24
  • 如何使vmware虚拟机中的Redflag Linux操作系统能够上网?

    如何使vmware虚拟机中的Redflag Linux操作系统能够上网? 第一种情况:主机使用PPPOE拨号上网方法一:NAT方式1、先关闭虚拟机中的操作系统,回到虚拟机主界面双击主界面右上方的的“Ethernet”,弹出“NetworkAdapter”对话框,选择“NAT”2、启动虚拟机操作系统,设置IP为动态获取,即通过DHCP获得。此时虚拟机中的操作系统用的是主机的IP,主机能够上网,那么虚拟机也能。方法二:Host-only方式1

    2022年8月20日
    3
  • 顺丰科技QT面试题「建议收藏」

    顺丰科技QT面试题「建议收藏」自定义控件:应该做过吧?能举几个例子吗?还有其他的吗?你觉得自定义控件的方法主要是哪些?答:从外观设计上:QSS、继承绘制函数重绘、继承QStyle相关类重绘、组合拼装等等从功能行为上:重写事件函数、添加或者修改信号和槽等等QSS:QSS平时使用的多吗?能举几个例子吗?都是如何使用,能说说吗?答:1.将QSS统一写在一个文件中,通过程序给主窗口加载;2.写成一个字符串中,通过程序给主窗口加载;3.需要使用的地方,写一个字符串,加载给对象;4.QTDesigner中填写;事件机制:

    2022年6月25日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号