Spring 3.0注解开发的简单例子(@Service) -
spring注解@Component、@Service等自动生成bean的命名规则
spring注解@Component、@Service等⾃动⽣成bean的命名规则参考链接:信息来源今天碰到⼀个问题,写了⼀个@Service的bean,类名⼤致为:CUserxml配置:<context:component-scan base-package="com.xxx.xx.x"/>结果启动报错:No bean named 'cUser' is defined,即找不到名为cUser的beanbean的名字不是我预期的"cUser",临时将bean的名字硬性指定成了cUser来解决的,即:@Service("cUser")在⽹上找了半天,看到有位兄弟说得很有道理,引⽤⼀下(以下内容引⽤⾃篇⾸链接):但还是觉得⽐较奇怪,之前⼀直以为Spring对注解形式的bean的名字的默认处理就是将⾸字母⼩写,再拼接后⾯的字符,但今天看来不是这样的。
回来翻了⼀下原码,原来还有另外的⼀个特殊处理:当类的名字是以两个或以上的⼤写字母开头的话,bean的名字会与类名保持⼀致/** * Derive a default bean name from the given bean definition.* <p>The default implementation simply builds a decapitalized version* of the short class name: e.g. "mypackage.MyJdbcDao" -> "myJdbcDao".* <p>Note that inner classes will thus have names of the form* "outerClassName.InnerClassName", which because of the period in the* name may be an issue if you are autowiring by name.* @param definition the bean definition to build a bean name for* @return the default bean name (never {@code null})*/protected String buildDefaultBeanName(BeanDefinition definition) {String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());return Introspector.decapitalize(shortClassName);}/** * Utility method to take a string and convert it to normal Java variable* name capitalization. This normally means converting the first* character from upper case to lower case, but in the (unusual) special* case when there is more than one character and both the first and* second characters are upper case, we leave it alone.* <p>* Thus "FooBah" becomes "fooBah" and "X" becomes "x", but "URL" stays* as "URL".** @param name The string to be decapitalized.* @return The decapitalized version of the string.*/public static String decapitalize(String name) {if (name == null || name.length() == 0) {return name;} // 如果发现类的前两个字符都是⼤写,则直接返回类名if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&Character.isUpperCase(name.charAt(0))){return name;} // 将类名的第⼀个字母转成⼩写,然后返回 char chars[] = name.toCharArray();chars[0] = Character.toLowerCase(chars[0]); return new String(chars);}。
Spring注解@Componen、@Repository@Service、@Controller区别
Spring 2.5 中除了提供@Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和@Controller。
在目前的Spring 版本中,这3 个注释和@Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。
虽然目前这 3 个注释和@Component 相比没有什么新意,但Spring 将在以后的版本中为它们添加特殊的功能。
所以,如果Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用@Repository、@Service 和@Controller 对分层中的类进行注释,而用@Component 对那些比较中立的类进行注释。
在一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。
Spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。
它的作用和在xml文件中使用bean节点配置组件时一样的。
要使用自动扫描机制,我们需要打开以下配置信息:Java代码1. <?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="/schema/beans" xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.5.xsd/schema/context/schema/context/spring-context-2.5.xsd"2. >3.4. <context:component-scan base-package=”com.eric.spring”>5. </beans>6. 其中base-package为需要扫描的包(含所有子包)@Service用于标注业务层组件,@Controller用于标注控制层组件(如struts中的action),@Repository用于标注数据访问组件,即DAO组件,而@Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
spring注解@Service注解的使用解析
spring注解@Service注解的使⽤解析@Service注解的使⽤要说明@Service注解的使⽤,就得说⼀下我们经常在spring配置⽂件applicationContext.xml中看到如下图中的配置:<!-- 采⽤扫描 + 注解的⽅式进⾏开发可以提⾼开发效率,后期维护变的困难了,可读性变差了 --><context:component-scan base-package="com.study.persistent" />在applicationContext.xml配置⽂件中加上这⼀⾏以后,将⾃动扫描指定路径下的包,如果⼀个类带了@Service注解,将⾃动注册到Spring容器,不需要再在applicationContext.xml配置⽂件中定义bean了,类似的还包括@Component、@Repository、@Controller。
如这个类:@Service("courseDAO")@Scope("prototype")public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{......}其作⽤就相当于在applicationContext.xml配置⽂件⾥配置如下信息:<bean id="courseDAO"class="com.study.persistent.CourseDAOImpl" scope="prototype">......</bean>@Service("serviceName")注解相当于applicationContext.xml配置⽂件中配置的<bean id="serviceName">,表⽰给当前类命名⼀个别名,⽅便注⼊到其他需要⽤到的类中。
Spring常用的一些注解说明
Spring常⽤的⼀些注解说明@Configuration从Spring3.0,@Configuration⽤于定义配置类,可替换xml配置⽂件,被注解的类内部包含有⼀个或多个被@Bean注解的⽅法。
这些⽅法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进⾏扫描,并⽤于构建bean定义。
@Bean@Bean注解⽤于告诉⽅法,产⽣⼀个Bean对象,然后这个Bean对象交给Spring管理。
产⽣这个Bean对象的⽅法Spring只会调⽤⼀次,随后这个Spring将会将这个Bean对象放在⾃⼰的IOC容器中。
SpringIOC 容器管理⼀个或者多个bean,这些bean都需要在@Configuration注解下进⾏创建,在⼀个⽅法上使⽤@Bean注解就表明这个⽅法需要交给Spring进⾏管理。
@Autowired、@Resource@Resource和@Autowired注解都是⽤来实现依赖注⼊的。
只是@AutoWried按by type⾃动注⼊,⽽@Resource默认按byName⾃动注⼊。
♣ @Autowired@Autowired具有强契约特征,其所标注的属性或参数必须是可装配的。
如果没有Bean可以装配到@Autowired所标注的属性或参数中,⾃动装配就会失败,抛出NoSuchBeanDefinitionException.@Autowired可以对类成员变量、⽅法及构造函数进⾏标注,让 spring 完成 bean ⾃动装配的⼯作。
@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
♣ @Resource@Resource是JDK提供的注解,有两个重要属性,分别是name和type。
@Resource依赖注⼊时查找bean的规则既不指定name属性,也不指定type属性,则⾃动按byName⽅式进⾏查找。
Spring源码——@Component,@Service是如何被解析?
Spring源码——@Component,@Service是如何被解析?引⾔在Spring中,Component、Service是在⼯作中经常被使⽤到的注解,为了加深对Spring运⾏机制的理解,今天我们⼀起来看⼀下Spring中对Component等注解的处理⽅式Component注解源码在Component注解的源码中(已去掉多余⽆关内容)/*** Indicates that an annotated class is a "component".* Such classes are considered as candidates for auto-detection* when using annotation-based configuration and classpath scanning.*当使⽤基于注释的配置和类路径扫描时,此类将被视为⾃动检测的候选。
** <p>Other class-level annotations may be considered as identifying* a component as well, typically a special kind of component:* e.g. the {@link Repository @Repository} annotation or AspectJ's* 其他类级别的注释也可以被视为标识⼀个组件,通常是⼀种特殊的组件,,如Repository AspectJ注解* {@link ng.annotation.Aspect @Aspect} annotation.**/@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Indexedpublic @interface Component {/*** The value may indicate a suggestion for a logical component name,* to be turned into a Spring bean in case of an autodetected component.* @return the suggested component name, if any (or empty String otherwise)* 该值表明bean组件名称,以在⾃动检测到组件的情况下将其转换为Spring bean*/String value() default "";}上⾯第⼀段注释中其实已经告诉我们,Component 注解它是作为在基本注解⽅式配置Spring定义的时候,被其标注的类作为⾃动检测的候选对象通俗点讲就是,当使⽤Component-scan时,如果指定的包⾥⾯包含了被Component注解标识的类,其会被作为Spring bean对象,⾃动注册到Spring容器中。
Spring MVC3注解学习之简单入门范例
Spring MVC3注解学习之简单入门范例文章均为原创,转载请注明出处。
本文地址:/post/430.html之前做Web应用都是在用Struts2,觉得功能强大,效率也能提升很多,所以一直都很喜欢Struts。
虽然也曾经在接手前人遗留的项目时遭遇过Spring MVC,不过不知道是前人用的不好,还是自己水平差,亦或者是Spring MVC(那个时候还是2)本身的问题,让Spring MVC给自己留下了很不好的印象:配置文件繁琐、功能一般甚至简陋、不能够在开发效率上与Struts2媲美等等问题,致使自己一直以来都是带着偏见看待Spring MVC的,也因此一直都没有再去尝试过。
最近是一次偶然的机会,再次正面遭遇Spring MVC,不过这次它改头换面,由2升级到3了,看到别人基于Spring MVC注解方式写出来的简洁流畅的代码后,惊叹于Spring MVC3的注解驱动能力之强大,代码之简洁,觉得自己以前的偏见简直就是愚昧至极,不由地暗自对Spring MVC有了好感,打算实实在在尝试一把。
不过自己之前对Spring MVC确实不熟,加之这次升级的内容有点多,所以我找来了一份很好的入门文档《Spring3_MVC注解教程》作为自己的领路人。
这份PPT做的很好,本文也是在此基础上有感而发的,在此感谢作者陈雄华先生的辛勤劳动和无私奉献!本文所示代码均基于最新版SpringFrameword3.2.3,请知悉。
Spring MVC框架简介∙支持REST风格的URL∙添加更多注解,可完全注解驱动∙引入HTTP输入输出转换器(HttpMessageConverter)∙和数据转换、格式化、验证框架无缝集成∙对静态资源处理提供特殊支持∙更加灵活的控制器方法签名,可完全独立于Servlet API Spring MVC框架结构框架的实现者如何在应用中使用Spring-MVC?1.在应用中添加Spring框架支持;2.在web.xml中配置Spring-MVC的请求转发器(前端控制器)3.编写Spring-MVC的配置文件4.将任意JavaBean通过注解配置成Controller(控制器)并注解其中的方法5.完成步骤简单明了,接下来我们一步一步详细说明:在应用中加入Spring支持:因为Spring-MVC是属于SpringFramework的一部分,因此要在应用中使用Spring-MVC,就必须以引入Spring基础框架为前提,另外还包括beans、context、aop、web组件,将上述组件的jar及其依赖添加到buildpath下,就算完成了为应用添加Spring框架支持的工作,然后在web.xml中配置Spring的监听器,代码如下:另外,因为是在web应用中使用Spring,因此建议配置一个名为org.springframework.web.util.IntrospectorCleanupListener的监听器来处理资源回收的工作:再配置一个编码过滤器在web.xml中配置Spring-MVC的请求转发器(前端控制器)在应用中使用Spring-MVC比较简单,除了需要引入相关依赖库外,还需要在web.xml配置Spring-MVC的请求转发器,代码如下:编写Spring-MVC的配置文件在上述代码中,我们告知Spring-MVC的请求转发器我们的mvc配置在classpath:mvc-config.xml中,因此我们需要在该文件中正确描述我们的mvc配置信息,配置代码如下:将任意JavaBean通过注解配置成Controller(控制器)并注解其中的方法本文主要示范如何使用注解为应用添加Spring-MVC支持,因此本文中的所有MVC映射配置都采用注解方式,范例Controller如下所示:为了是上面的Controller能够正常使用,我们还需要在WebRoot下创建Controller 中使用的逻辑视图对应的视图文件,以上例中create为例,我们在WEB-INF/jsp/目录下新建jsp文件,内容如下:完成上述四个步骤后,将工程部署到任意web容器(本文采用tomcat6.0),然后启动,即可在浏览器中浏览映射出来的地址,如果需要在记录详细的Spring调试信息,则可以通过配置log4j来实现(这里多说一句,Spring的调试信息真的很详细很丰富,通过分析日志,将有助于我们快速理解和掌握Spring-MVC的工作原理)。
Servlet3.0中@WebServlet注解
Servlet3.0中@WebServlet注解在Servlet3.0(Tomcat7.0)以后,我们可以不⽤在web.xml⾥⾯配置servlet,只需要定义Servlet类时,加上@WebServlet注解(annotation)就可以修改该Servlet的属性了。
如果在@WebServlet中需要设置多个属性,必须给属性值加上属性名称,中间⽤逗号隔开,否则会报错。
若没有设置@WebServlet的name属性,默认值会是Servlet的类完整名称。
属性名类型描述name String指定Servlet 的 name 属性,等价于<servlet-name>。
如果没有显式指定,则该 Servlet 的取值即为类的全限定名。
value String[]该属性等价于urlPatterns属性。
两个属性不能同时使⽤。
urlPatterns String[]指定⼀组 Servlet 的 URL 匹配模式。
等价于<url-pattern>标签。
loadOnStartup int指定 Servlet 的加载顺序,等价于<load-on-startup>标签。
initParams WebInitParam[]指定⼀组 Servlet 初始化参数,等价于<init-param>标签。
asyncSupported boolean声明 Servlet 是否⽀持异步操作模式,等价于<async-supported>标签。
description String该 Servlet 的描述信息,等价于<description>标签。
displayName String该 Servlet 的显⽰名,通常配合⼯具使⽤,等价于<display-name>标签。
例如@WebServlet(urlPatterns = { "/DServlet", "/EServlet", "/FServlet" }, loadOnStartup = 0, initParams = {@WebInitParam(name = "p1", value = "v1"),@WebInitParam(name = "p2", value = "v2") })public class DServlet extends HttpServlet {......}或者@WebServlet(value = { "/DServlet", "/EServlet", "/FServlet" }, loadOnStartup = 0, initParams = {@WebInitParam(name = "p1", value = "v1"),@WebInitParam(name = "p2", value = "v2") })public class DServlet extends HttpServlet {......}。
Spring注解@component、@service、@Autowired等作用与区别
Spring注解@component、@service、@Autowired等作⽤与区别1、@Service⽤于标注业务层组件2、@Controller⽤于标注控制层组件(如struts中的action)3、@Repository⽤于标注数据访问组件,即DAO组件.4、@Component泛指组件,当组件不好归类的时候,我们可以使⽤这个注解进⾏标注。
5、@Autowired与@Resource的区别: @Autowired由Spring提供,只按照byType注⼊,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。
如果想使⽤名称装配可以结合@Qualifier注解进⾏使⽤。
public class UserService {@Autowired@Qualifier(name="userDao1")private UserDao userDao;} @Resource由J2EE提供,默认按照byName⾃动注⼊,Spring将@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。
所以如果使⽤name属性,则使⽤byName的⾃动注⼊策略,⽽使⽤type属性则使⽤byType⾃动注⼊策略。
①如果同时指定了name和type,则从Spring上下⽂中找到唯⼀匹配的bean进⾏装配,找不到则抛出异常。
②如果指定了name,则从上下⽂中查找名称(id)匹配的bean进⾏装配,找不到则抛出异常。
③如果指定了type,则从上下⽂中找到类似匹配的唯⼀bean进⾏装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,⼜没有指定type,则⾃动按照byName⽅式进⾏装配;如果没有匹配,则回退为⼀个原始类型进⾏匹配,如果匹配则⾃动装配。
总结:@Resource的作⽤相当于@Autowired,只不过@Autowired按byType⾃动注⼊。
spring提供的常用注解
spring提供的常⽤注解spring常⽤注解⼀共5个:可以分为两类第⼀类: 声明组件类:@Component(通⽤,放哪⾥都可以)、@Controller、@Service、@ Repository 第⼆类: 注⼊类:@Resource 、@Autowired ⽤于注⼊详解:1、@Component:是所有受Spring 管理组件的通⽤形式2、@Controller:声明“表现层(Controller)”组件 @Controller @Scope("prototype")【⾮单利】 @Scope="singleton"【单利】 public class UserAction extends BaseAction<User>{ …… }3、@Service:声明“业务逻辑层(Service)”组件 @Service("userService")public class UserServiceImpl implements UserService { ……}4、@ Repository 声明“数据层Dao”组件 @Repository对应数据访问层Bean @Repository(value="userDao") public class UserDaoImpl extends BaseDaoImpl<User> { ……… }5、@Resource ⽤于注⼊(srping提供的) 默认按名称装配 @Autowired ⽤于注⼊,(srping提供的) 默认按类型装配 // 注⼊userService @Resource(name = "userService") private UserService userService;此上是我个⼈总结个⼀⼈意见忘⼤家能够佐证,感激不尽。
spring3.0MVC注解(附实例)
0.提示1) Spring发行版本附带了PetClinic 示例,它是一个在简单的表单处理的上下文中,利用了本节中说明的注解支持的Web应用程序。
可以在“samples/petclinic ”目录中找到PetClinic 应用程序。
2) 另外一个建立在基于注解的Web MVC上的示例应用程序,请见imagedb 。
这个示例集中在无状态的multi-action控制器,包括多段文件上传的处理。
可以在“samples/imagedb ”目录找到imagedb 应用程序。
1.建立dispatcher实现注解支持只有对应的HandlerMapping(为了实现类型级别的注解)和/ 或HandlerAdapter(为了实现方法级别的注解)出现在 dispatcher中时, @RequestMapping 才会被处理。
这在DispatcherServlet 和DispatcherPortlet 中都是缺省的行为。
然而,如果是在定义自己的HandlerMappings或HandlerAdapters,就需要确保一个对应的自定义的DefaultAnnotation HandlerMapping和 /或AnnotationMethod HandlerAdapter同样被定义——假设想要使用@RequestMapping 。
例1:雁联zfpt-servlet.xml例2:web.xml2.1 webAppRootKey2.3 log4jConfigLocation2.4 contextConfigLocation2.5 springSecurityFilterChain2.6 Log4jConfigListener2.7 ContextLoaderListener2.8 DispatcherServlet2.9 exception.java例3:雁联web.xml如果你想要自定义映射策略,显式的定义一个DefaultAnnotationHandlerMapping和 /或AnnotationMethodHandlerAdapter也有实际意义。
service注解的 表达式
文章标题:深度解析service注解的表达式:从简到繁,逐步揭示其价值一、什么是service注解的表达式?在Java编程语言中,我们经常会遇到service注解。
而这里指定的主题是service注解的表达式。
那么,首先我们需要了解什么是service 注解以及它的表达式是什么意思。
1.1 service注解的作用service注解是Java中用来标记类为服务类的注解,在Spring框架中尤其常见。
通过在类上使用@Service注解,我们可以告诉Spring容器,这个类是一个服务类,需要被实例化并注入到其他需要调用它的地方。
1.2 service注解的表达式含义而在service注解中,我们常常会看到表达式的使用。
这里的表达式指的是service注解中的一些属性值,比如value、name、description 等。
这些表达式的含义和作用是什么呢?这就是我们这篇文章要深度探讨的内容。
二、service注解表达式的深入解析2.1 value属性在@Service注解中,我们最常见的表达式就是value属性。
这个属性用来指定服务bean的名称,在Spring容器中注册服务的时候会使用到。
我们可以通过value属性来指定特定的名称,以便在其他地方能够准确地引用到这个服务。
2.2 name属性除了value属性之外,@Service注解还有一个name属性。
这个属性与value属性类似,也是用来指定服务bean的名称的。
但是在某些特定的场景下,name属性可能会起到一些额外的作用,我们需要深入理解其使用场景和意义。
2.3 description属性有时候,为了让其他开发者更好地理解这个服务类的作用和特点,我们会在@Service注解中使用description属性。
这个属性可以用来描述这个服务类的作用、功能、特点等信息,有助于代码的可读性和可维护性。
三、service注解表达式的实际应用和价值3.1 实际应用场景在实际的项目开发中,我们会经常遇到需要定义和注册服务类的场景。
java service注解案例
java service注解案例java service注解是Java开发中常用的注解之一,它具有简化代码、提高代码可读性和可维护性的优点。
在本文中,我将通过介绍一个具体的java service注解案例,来深入探讨这个主题。
1. 什么是java service注解Java service注解是一种用来标识服务类的注解。
在Java开发中,服务类常常具有一些特殊的功能,例如处理业务逻辑、数据存储、网络通信等。
为了使这些服务类能够被其他组件或模块直接调用和使用,我们通常需要将其注册到某个容器中。
而java service注解则提供了一种简洁、统一的方式来完成这个注册过程。
2. java service注解案例介绍假设我们有一个名为"UserService"的服务类,用来处理用户相关的业务逻辑。
我们想要将该服务类注册到一个名为"ServiceRegistry"的服务注册表中。
在这个案例中,我们可以使用java service注解来实现这个功能。
具体步骤如下:(1)在"UserService"类上添加java service注解,例如:```@Servicepublic class UserService {// ... 省略其他代码}```(2)在"ServiceRegistry"类中编写注册方法,用于将带有@Service 注解的服务类注册到注册表中,例如:```public class ServiceRegistry {private Map<String, Object> serviceMap = new HashMap<>();public void registerService(Object service) {if (service.getClass().isAnnotationPresent(Service.class)) { Service annotation =service.getClass().getAnnotation(Service.class);String serviceName = annotation.value();serviceMap.put(serviceName, service);}}}```(3)在某个入口类中使用注册方法,例如:```public class Main {public static void main(String[] args) {UserService userService = new UserService();ServiceRegistry serviceRegistry = new ServiceRegistry(); serviceRegistry.registerService(userService);}}```通过以上步骤,我们成功地将"UserService"类注册到了"ServiceRegistry"的服务注册表中。
Spring 3.0 注解注入详解
Spring 3.0 注解注入详解1.@Autowir注解(不推举用法,建议用法@Resource) @Autowired可以对成员变量、办法和构造函数举行标注,来完成自动装配的工作。
@Autowired的标注位置不同,它们都会在Spring在初始化这个bean 时,自动装配这个属性。
要使@Autowired能够工作,还需要在配置文件中加入以下 Xml代码 bean / 2. @Qualifier注解 @Autowired 是按照类型举行自动装配的。
例如,假如当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异样;假如Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异样。
我们可以用法@Qualifier协作@Autowired来解决这些问题。
如下: 1). 可能存在多个UserDao实例Java代码 @Autowired @Qualifier("userServiceImpl") public IUserService userService; 或者 Java代码 @Autowired public vo UserDao(@Qualifier("userDao") UserDao userDao){ erDao = userDao; 这样,Spring会找到id为userServiceImpl和userDao的bean举行装配。
2). 可能不存在UserDao实例 Java代码 @Autowired(required = fae) public IUserService userService; 3. @Resource注解 JSR-250标准注解,推举用法它来代替Spring专有的@Autowired注解。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入罢了。
@serviceOpreation注解
@serviceOpreation注解@Service注解是标注在实现类上的,因为@Service是把spring 容器中的bean进行实例化,也就是等同于new操作,只有实现类是可以进行new实例化的,而接口则不能,所以是加在实现类上的。
(@Repository 同理可得)(特殊情况:Spring + Mybatis 整合中,@Repository 是作用在Dao的接口类上的)首先说@Service、@Repository注解的作用吧,也就是IOC的思想,IOC中文就是控制反转,但这个晦涩难懂,所以有个新词代替这个词就是依赖注入,就是,调用类对某个接口实现类的依赖调用由第三方(Spring的容器)来实现,以移除调用类对某一接口实现类的依赖,从而减少代码的耦合度。
那么通过控制反转(IOC)是怎么实现减少耦合的呢?总结网上的说法,从两个角度出发1、控制反转①软件系统在没有引入IoC容器之前,对象A依赖对象B,那么A对象在实例化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建好的对象B,其中不管是创建还是使用已创建的对象B,控制权都在我们自己手上。
②如果软件系统引入了Ioc容器之后,对象A和对象B之间失去了直接联系,所以,当对象A实例化和运行时,如果需要对象B的话,IoC容器会主动创建一个对象B注入到对象A所需要的地方。
③通过前面①②的对比,可以看到对象A获得依赖对象B的过程,由主动行为变成了被动行为,即把创建对象交给了IoC容器处理,控制权颠倒过来了,这就是控制反转的由来!注:在控制反转与解耦过程中使用了设计模式中的工厂模式。
2、工厂模式工厂模式是指当应用程序中甲组件需要乙组件协助时,并不是在甲组件中直接实例化乙组件对象,而是通过乙组件的工厂获取,即该工厂可以生成某一类型组件的实例对象。
在这种模式下,甲组件无需与乙组件以硬编码的方式耦合在一起,而只需与乙组件的工厂耦合那么这样的话,通过依赖注入就可以完全不用关心对象的生命周期,什么时候被创建,什么时候销毁,只需直接使用即可,对象的生命周期由提供依赖注入的框架来管理,从而,让使用框架者,可以将重心完全放到业务逻辑处理的开发上。
305spring305mybatis304全注解实例详解.doc
Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)2012-07-31 15:35 198人阅读评论(0) 收藏举报Spring更新到3.0之后,其MVC框架加入了一个非常不错的东西——那就是REST。
它的开放式特性,与Spring的无缝集成,以及Spring框架的优秀表现,使得现在很多公司将其作为新的系统开发框架。
大象根据实际的项目经验,以之前SSH2例子为基础,对其进行一次大改造,详细的为大家讲解如何实现SSM3全注解式的开发。
这次大象将采取两种构建方式,一是很多人喜欢用的MyEclipse,另一个,则是用Eclipse+Maven。
这一篇,将主要讲解开发环境设置与Maven构建方式。
1、开发环境JDK1.6.0_18Eclipse3.2.1 MyEclipse5.1.0Eclipse-JEE-HELIOS-SR2 Maven3.0.1 m2eclipse0.12.1.20110112-1712Tomcat6.0.10 maven-jetty-plugin6.1.26MySQL5.0.27 Navicat Lite for MySQL 8.1.20每个人的开发环境可能会有差异,但有一点我需要说明的是,JDK的版本不得低于1.5,因为用到了很多1.5版才支持的新特性。
Tomcat、Jetty、Maven和MySQL请不要低于我所用的版本,因为我没在其它的版本上进行测试。
Navicat则是MySQL数据库的图形化操作工具。
接下来我将介绍如何在Eclipse3.6中,使用m2eclipse插件构建web应用及测试开发环境。
2、设置MavenMaven的安装很简单,只需要解压即可,请设置PATH变量,这样可以使用命令行进行操作,然后就要在%MAVEN_HOME%\conf目录下,对settings.xml作下修改这就是设置本地仓库,目录可以根据自己的实际情况更改,不过请使用"/"正斜杠,因为我在实际使用中,发现反斜杠有时候获取不到资源。
spring纯注解案例
spring纯注解案例spring纯注解案例我们发现,之所以我们现在离不开xml配置⽂件,是因为我们有⼀句很关键的配置:<!-- 告知spring框架在,读取配置⽂件,创建容器时,扫描注解,依据注解创建对象,并存⼊容器中 --><context:component-scan base-package=**"com.itheima"**></context:component-scan>如果他要也能⽤注解配置,那么我们就可以脱离xml⽂件了。
1、准备jar包基于maven项⽬<!-- https:///artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.6.RELEASE</version></dependency><!-- https:///artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.6.RELEASE</version></dependency>2、编写实体类package com.yl.bean;import java.io.Serializable;/*** ⽤户实体类*/public class User implements Serializable {private Integer id;private String username;private String password;public User() {}public User(Integer id, String username, String password) {this.id = id;ername = username;this.password = password;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {ername = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}3、编写业务层业务层接⼝package com.yl.service;/*** ⽤户业务层接⼝*/public interface IUserService {/*** 查询⽤户*/public void queryUser();}业务层接⼝实现类package com.yl.service.impl;import com.yl.dao.IUserDao;import com.yl.service.IUserService;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import javax.annotation.Resource;/*** ⽤户业务层接⼝实现类*/@Service("userService")//使⽤注解创建业务层bean对象public class IUserServiceImpl implements IUserService {@Resource(name = "userDao")//使⽤注解注⼊指定bean对象 private IUserDao iUserDao;//⽤户持久层对象/*** 查询⽤户*/@Overridepublic void queryUser() {iUserDao.queryUser();}}4、编写持久层持久层接⼝package com.yl.dao;/*** ⽤户持久层接⼝*/public interface IUserDao {/*** 查询⽤户*/public void queryUser();}持久层接⼝实现类package com.yl.dao.impl;import com.yl.dao.IUserDao;import org.springframework.stereotype.Repository;/*** ⽤户持久层接⼝实现类*/@Repository("userDao")//使⽤注解创建持久层bean对象public class IUserDaoImpl implements IUserDao {/*** 查询⽤户*/@Overridepublic void queryUser() {System.out.println("查询成功");}}5、配置类package com.yl.cfg;import ponentScan;import org.springframework.context.annotation.Configuration;import ponent;/*** spring配置类*/@Configuration//指定当前类为spring的配置类@ComponentScan(basePackages = "com.yl")//配置要扫描的包public class SpringCfg {}6、模拟表现层(测试)package com.yl.ui;import com.yl.cfg.SpringCfg;import com.yl.service.IUserService;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 表现层*/public class UI {public static void main(String[] args) {//1.获取容器ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringCfg.class);//2.根据id获取对象IUserService userService = (IUserService) applicationContext.getBean("userService");//查询⽤户userService.queryUser();}}7、@Configuration注解说明作⽤:⽤于指定当前类是⼀个spring配置类,当创建容器时会从该类上加载注解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Collection;
在 ② 处,配置了一个 AnnotationMethodHandlerAdapter,它负责根据 Bean 中的 Spring MVC 注解对 Bean 进行加工处理,使这些 Bean 变成控制器并映射特定的 URL 请求。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
来看一下基于注解的 Controller 是如何定义做到这一点的,下面是使用注解的 BbtForumController:
清单 1. BbtForumController.java
package com.baobaotao.otao.service.BbtForumService;
<bean class="org.springframework.web.servlet.mvc.annotation.
AnnotationMethodHandlerAdapter"/>
<!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
</beans>
因为 Spring 所有功能都在 Bean 的基础上演化而来,所以必须事先将 Controller 变成 Bean,这是通过在类中标注 @Controller 并在 annomvc-servlet.xml 中启用组件扫描机制来完成的,如 ① 所示。
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
清单 3. annomvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
@Controller //<——①
@RequestMapping("/forum.do")
public class BbtForumController {
@Autowired
private BbtForumService bbtForumService;
真正让 BbtForumController 具备 Spring MVC Controller 功能的是 @RequestMapping 这个注解。@RequestMapping 可以标注在类定义处,将 Controller 和特定请求关联起来;还可以标注在方法签名处,以便进一步对请求进行分流。在 ① 处,我们让 BbtForumController 关联“/forum.do”的请求,而 ② 处,我们具体地指定 listAllBoard() 方法来处理请求。所以在类声明处标注的 @RequestMapping 相当于让 POJO 实现了 Controller 接口,而在方法定义处的 @RequestMapping 相当于让 POJO 扩展 Spring 预定义的 Controller(如 SimpleFormController 等)。
@RequestMapping //<——②
public String listAllBoard() {
bbtForumService.getAllBoard();
System.out.println("call listAllBoard method.");
<servlet-mapping>
<servlet-name>annomvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
web.xml 中定义了一个名为 annomvc 的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/annomvc-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。annomvc-servlet.xml 的配置内容如下所示:
return "listBoard";
}
}
从上面代码中,我们可以看出 BbtForumController 和一般的类并没有区别,它没有实现任何特殊的接口,因而是一个地道的 POJO。让这个 POJO 与众不同的魔棒就是 Spring MVC 的注解!
在 ① 处使用了两个注解,分别是 @Controller 和 @RequestMapping。在“使用 Spring 2.5 基于注解驱动的 IoC” 这篇文章里,笔者曾经指出过 @Controller、@Service 以及 @Repository 和 @Component 注解的作用是等价的:将一个类成为 Spring 容器的 Bean。由于 Spring MVC 的 Controller 必须事先是一个 Bean,所以 @Controller 注解是不可缺少的。
<!-- Spring 容器启动监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
/schema/beans/spring-beans-2.5.xsd
/schema/context
/schema/context/spring-context-2.5.xsd">
本文将介绍 Spring 2.5 新增的 Sping MVC 注解功能,讲述如何使用注解配置替换传统的基于 XML 的 Spring MVC 配置。
回页首
一个简单的基于注解的 Controller
使用过低版本 Spring MVC 的读者都知道:当创建一个 Controller 时,我们需要直接或间接地实现 org.springframework.web.servlet.mvc.Controller 接口。一般情况下,我们是通过继承 SimpleFormController 或 MultiActionController 来定义自己的 Controller 的。在定义 Controller 后,一个重要的事件是在 Spring MVC 的配置文件中通过 HandlerMapping 定义请求和控制器的映射关系,以便将两者关联起来。
/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Spring Annotation MVC Sample</display-name>
<!-- Spring 服务层的配置文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="/xml/ns/javaee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能。现在你无须让 Controller 继承任何接口,无需在 XML 配置文件中定义请求和 Controller 的映射关系,仅仅使用注解就可以让一个 POJO 具有 Controller 的绝大部分功能 —— Spring MVC 框架的易用性得到了进一步的增强.在框架灵活性、易用性和扩展性上,Spring MVC 已经全面超越了其它的 MVC 框架,伴随着 Spring 一路高唱猛进,可以预见 Spring MVC 在 MVC 市场上的吸引力将越来越不可抗拒。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>