【美高梅开户网址】接纳表明代替布置文件,spring框架学习笔记5

spring框架学习笔记3:使用申明代替布置文件,spring学习笔记

1.导入context约束:spring-context-4.2.xsd

美高梅开户网址 1

 

2.design格局打开xml配置文件,右键edit namespaces,点击add增加

美高梅开户网址, 

美高梅开户网址 2

 

形成后应该是这么:

美高梅开户网址 3

 

安排文件中如此写就能够:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd ">
    <context:component-scan base-package="bean"></context:component-scan>
</beans>

 

在类中如此使用注明:

package bean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.junit.validator.PublicClassValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//代替的配置文件内容<bean name="user" class="bean.User"/>
//  @Component("user")//四种本质相同,为了方便理解建议使用以下三种
//    @Service("user")//service层使用
//    @Controller("user")//web层使用
    @Repository("user")//dao层使用
//指定对象的作用范围
@Scope(scopeName="singleton")
public class User {
    @Value("Tom")//赋值
    private String name;

    private Integer age;

    //@Autowired//对象赋值,自动装配
    //存在问题:如果是多个类型一致的对象,无法分辨
    @Resource(name="car")//这种方式可以明确指定(推荐)
    private Car car;

    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    @Value("20")//也可以在set方法赋值,效果一样,但不破坏封装性
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
    }

    @PostConstruct//初始化方法,当相于配置文件中的init-mothod
    public void init(){
        System.out.println("初始化");
    }
    @PreDestroy//销毁方法
    public void destory(){
        System.out.println("销毁");
    }

}

 

Car类:

package bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component("car")
public class Car {
    @Value("car2")
    private String  name;
    private String color;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    @Override
    public String toString() {
        return "Car [name=" + name + ", color=" + color + "]";
    }


}

 

1.导入context约束:spring-context-4.2.xsd
2.design形式展开xml配置文件,右键edit name…

spring要使用annotation得在beans.xml里添加
xmlns:context=”http://www.springframework.org/schema/context”
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd

spring框架学习笔记5:SpringAOP示例,springspringaop

1.导包:

导入spring中的那三个包

美高梅开户网址 4

 

再导入别的包(网络下载):

美高梅开户网址 5

 

2.计划目的对象:

美高梅开户网址 6

package service;

public class UserServiceImpl implements UserService {
    @Override
    public void save() {
        System.out.println("保存用户!");
    }
    @Override
    public void delete() {
        System.out.println("删除用户!");
    }
    @Override
    public void update() {
        System.out.println("更新用户!");
    }
    @Override
    public void find() {
        System.out.println("查找用户!");
    }
}

View Code

 

3.预备通告:

package springaop;

import org.aspectj.lang.ProceedingJoinPoint;

//通知类
public class MyAdvice {

    //前置通知    
//        |-目标方法运行之前调用
    //后置通知(如果出现异常不会调用)
//        |-在目标方法运行之后调用
    //环绕通知
//        |-在目标方法之前和之后都调用
    //异常拦截通知
//        |-如果出现异常,就会调用
    //后置通知(无论是否出现 异常都会调用)
//        |-在目标方法运行之后调用
//----------------------------------------------------------------
    //前置通知
    public void before(){
        System.out.println("这是前置通知!!");
    }
    //后置通知
    public void afterReturning(){
        System.out.println("这是后置通知(如果出现异常不会调用)!!");
    }
    //环绕通知
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("这是环绕通知之前的部分!!");
        Object proceed = pjp.proceed();//调用目标方法
        System.out.println("这是环绕通知之后的部分!!");
        return proceed;
    }
    //异常通知
    public void afterException(){
        System.out.println("出现异常了!");
    }
    //后置通知
    public void after(){
        System.out.println("这是后置通知(出现异常也会调用)!");
    }
}

 

 

4.布局将通报织入指标对象

(导入aop约束)

美高梅开户网址 7

 

bean包的user对象:

package bean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;

import org.junit.validator.PublicClassValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

//代替的配置文件内容<bean name="user" class="bean.User"/>
//    @Component("user")//四种本质相同,为了方便理解建议使用以下三种
//    @Service("user")//service层使用
//    @Controller("user")//web层使用
    @Repository("user")//dao层使用
//指定对象的作用范围
@Scope(scopeName="singleton")
public class User {
    @Value("Tom")//赋值
    private String name;

    private Integer age;

    //@Autowired//对象赋值,自动装配
    //存在问题:如果是多个类型一致的对象,无法分辨
    @Resource(name="car")//这种方式可以明确指定(推荐)
    private Car car;

    public Car getCar() {
        return car;
    }
    public void setCar(Car car) {
        this.car = car;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    @Value("20")//也可以在set方法赋值,效果一样,但不破坏封装性
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
    }

    @PostConstruct//初始化方法,当相于配置文件中的init-mothod
    public void init(){
        System.out.println("初始化");
    }
    @PreDestroy//销毁方法
    public void destory(){
        System.out.println("销毁");
    }

}

 

 

 

xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">

<!-- 准备工作: 导入aop(约束)命名空间 -->
<!-- 1.配置目标对象 -->
    <bean name="userService" class="service.UserServiceImpl" ></bean>
<!-- 2.配置通知对象 -->
    <bean name="myAdvice" class="springaop.MyAdvice" ></bean>
<!-- 3.配置将通知织入目标对象 -->
    <aop:config>
        <!-- 配置切入点 
            public void service.UserServiceImpl.save()   切点为save()方法 
            void service.UserServiceImpl.save()   public可以省略
            * service.UserServiceImpl.save()   返回值不做要求,可以*代替
            * service.UserServiceImpl.*()    为某类的所有空参方法

            * service.*ServiceImpl.*(..)    最终形态:从某包下找以serviceimpl结尾的类的所有方法
            * service..*ServiceImpl.*(..)
        -->
        <aop:pointcut expression="execution(* service.*ServiceImpl.*(..))" id="pc"/>
        <aop:aspect ref="myAdvice" >
            <!-- 指定名为before方法作为前置通知 -->
            <aop:before method="before" pointcut-ref="pc" />
            <!-- 后置 -->
            <aop:after-returning method="afterReturning" pointcut-ref="pc" />
            <!-- 环绕通知 -->
            <aop:around method="around" pointcut-ref="pc" />
            <!-- 异常拦截通知 -->
            <aop:after-throwing method="afterException" pointcut-ref="pc"/>
            <!-- 后置 -->
            <aop:after method="after" pointcut-ref="pc"/>
        </aop:aspect>
    </aop:config>
</beans>

 

 

测试类:

package springaop;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import bean.User;
import service.UserService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:springaop/applicationContext.xml")
public class Demo {
    @Resource(name="userService")
    private UserService us;

    @Test
    public void fun1(){
        us.save();
    }

}

 

 

调用sava方法:调控台打字与印刷如下

美高梅开户网址 8

 

 

 

 

增加补充(这种方法不引入,了然就能够):

能够不应用xml配置文件,改为评释

package annotationaop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

//通知类
@Aspect
//表示该类是一个通知类
public class MyAdvice {
    @Pointcut("execution(* service.*ServiceImpl.*(..))")
    public void pc(){}
    //前置通知
    //指定该方法是前置通知,并制定切入点
    @Before("MyAdvice.pc()")
    public void before(){
        System.out.println("这是前置通知!!");
    }
    //后置通知
    @AfterReturning("MyAdvice.pc()")
    public void afterReturning(){
        System.out.println("这是后置通知(如果出现异常不会调用)!!");
    }
    //环绕通知
    @Around("MyAdvice.pc()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("这是环绕通知之前的部分!!");
        Object proceed = pjp.proceed();//调用目标方法
        System.out.println("这是环绕通知之后的部分!!");
        return proceed;
    }
    //异常通知
    @AfterThrowing("MyAdvice.pc()")
    public void afterException(){
        System.out.println("出现异常了!");
    }
    //后置通知
    @After("MyAdvice.pc()")
    public void after(){
        System.out.println("这是后置通知(出现异常也会调用)!!");
    }
}

 

布署文件做相应修改:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">

<!-- 准备工作: 导入aop(约束)命名空间 -->
<!-- 1.配置目标对象 -->
    <bean name="userService" class="service.UserServiceImpl" ></bean>
<!-- 2.配置通知对象 -->
    <bean name="myAdvice" class="annotationaop.MyAdvice" ></bean>
<!-- 3.开启使用注解完成织入 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

 

1.导包: 导入spring中的那七个包 再导入其余包(互连网下载):
2.备选目的对象: package ser…

转自:

<?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/>

</beans>

我们商家使了Ali的dubbo,不过Ali的开源网址

在myeclipse要什么能力提示context:
【美高梅开户网址】接纳表明代替布置文件,spring框架学习笔记5。window-preferences-xmlcatalog-add-filesystem
在spring包里dist-resources找到spring-context-2.5.xsd加进去。
普普通通会自动生成key,不过得把spring-context-2.5.xsd加到key里面去,才会真正给您唤醒。有的不用。那样beans.xml就能够活动唤醒context了。

咱俩的施用的spring配置文件里有类似的布置:

@Autowired评释,平时写在set方法上,自动帮你找一个和那个参数类型对应的二个bean。借使你要在userService那个bean里注入u那一个bean,不用在xml配置文件里写property属性间接在set方法这里写表明如:但是要在xml里写
<context:annotation-config/>,

 

@Autowired
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

<bean id="u" class="com.ljs.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.ljs.service.UserService">

[html] view
plaincopy

对了那一个注脚是比照项目来合营的。若是有多个同品种的bean呢如:

 

@Autowired
    public void setUserDao(@Qualifier("u") UserDao userDao) {
        this.userDao = userDao;
    }

<bean id="u" class="com.ljs.dao.impl.UserDaoImpl"/>
<bean id="u1" class="com.ljs.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.ljs.service.UserService">

 

只要想要myeclipse自动提醒注脚能够如此做:
window-preferences-general-editor-context-assist
把最上边的@#里的@写到地点产生.@就行了。

 

接下去是比较关键的@Resource注脚,因为那是je22定义的标准,所以小编得导入je22的
包common-annotations.jar,然后在set方法上用@Resource
情趣是本人在此处引用多个能源,什么能源呢,这么些能源的名字应该跟set方法名同样的bean资源还是其余财富。暗中认可注入的章程是byType。如:

  1. <?xml version=”1.0″ encoding=”UTF-8″?>  
  2. <beans xmlns=””  
  3.     xmlns:xsi=”” xmlns:dubbo=””  
  4.     xsi:schemaLocation=”  
  5.               
  6.               
  7.             ;  
        <bean id="userDao1" class="com.ljs.dao.impl.UserDaoImpl" />
    <bean id="userDao2" class="com.ljs.dao.impl.UserDaoImpl" />
    <bean id="userService" class="com.ljs.service.UserService" />

@Resource
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

大家都晓得Spring在运营时是要核准XML文件的。大概干什么在Eclipse里xml没错误提醒?

因为是暗许是byType所以那样会报错,得把userDao1只怕userDao2去掉就行。不过

 

举个例子那样的一个Spring配置:

 

[html] view
plaincopy

 

 

 

  1. <?xml version=”1.0″ encoding=”UTF-8″?>  
  2. <beans xmlns=””  
  3.     xmlns:xsi=””  
  4.     xsi:schemaLocation=” ;  
  5. </beans>  

咱俩也能够在背后加上版本号:

 

 

[html] view
plaincopy

 

 

 

  1. xsi:schemaLocation=” ;  

有那一个版本号和尚未有怎样分别吧?

 

XML的一部分概念

率先来看下xml的有个别定义:

xml的schema里有namespace,可以给它起各自名。举例大面积的spring的namespace:

 

[html] view
plaincopy

 

 

 

  1. xmlns:mvc=””  
  2. xmlns:context=””  

平时状态下,namespace对应的U讴歌MDXI是贰个寄存XSD的地址,纵然标准未有这么供给。如果没有提供schemaLocation,那么Spring的XML剖析器会从namespace的UQashqaiI里加载XSD文件。我们得以把计划文件改成那个样子,也是足以健康办事的:

 

 

[html] view
plaincopy

 

 

 

  1. <?xml version=”1.0″ encoding=”UTF-8″?>  
  2. <beans xmlns=””  
  3.     xmlns:xsi=”;  

schemaLocation提供了二个xml
namespace到相应的XSD文件的二个炫人眼目,所以我们可以看出,在xsi:schemaLocation前边配置的字符串都是成对的,前边的是namespace的U昂CoraI,前边是xsd文件的U奥德赛I。举个例子:

 

 

[html] view
plaincopy

 

 

 

  1. xsi:schemaLocation=”  
  2.   
  3.   
  4. ”  

 

Spring是何许校验XML的

Spring默许在运行时是要加载XSD文件来验证xml文件的,所以一旦有的时候断网了,或许部分开源软件切换域名,那么就很轻巧蒙受应用运营不了。作者回想那时Oracle收购Sun公司时,蒙受过那些境况。

为了幸免这种景观,Spring提供了一种体制,默许从地面加载XSD文件。展开spring-context-3.2.0.RELEASE.jar,能够看来里边有多少个特地的公文:

spring.handlers

 

[plain] view
plaincopy

 

 

 

  1. http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler  
  2. http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler  
  3. http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler  
  4. http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler  
  5. http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler  

 

spring.schemas

 

[plain] view
plaincopy

 

 

 

  1. http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd  
  2. http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd  
  3. http\://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd  
  4. http\://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd  
  5. http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd  
  6. …  

 

再张开jar包里的org/springframework/context/config/ 目录,能够看来下边有

spring-context-2.5.xsd
spring-context-3.0.xsd
spring-context-3.1.xsd
spring-context-3.2.xsd

很醒目,能够想到Spring是把XSD文件放到本地了,再在spring.schemas里做了二个辉映,优先从本土里加载XSD文件。

并且Spring很恩爱,把旧版本的XSD文件也全放了。这样可避防止进级了Spring版本,而布署文件里用的还是旧版本的XSD文件,然后断网了,应用运营不了。

大家还足以看来,在未曾配备版本号时,用的正是现阶段版本的XSD文件:

 

[html] view
plaincopy

 

 

 

  1. http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd  

平等,大家打开dubbo的jar包,能够在它的spring.schemas文件里看看有那样的布局:

 

 

[html] view
plaincopy

 

 

 

  1. http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd  

所以,Spring在加载dubbo时,会从dubbo的jar里加载dubbo.xsd。

 

固然如此起步没非常,但xml验证Failed to read schema document

能够经过eclipse 手动增添schema文件来化解那些主题素材,如图:

美高梅开户网址 9

美高梅开户网址 10

美高梅开户网址 11

铺排成功后,右击applicationContext-dubbo.xml选择validate,举办xml重新验证就可以。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图