Blog

spring特点-IOC容器启动的三种方式

前期准备工作

使用IDE:IDEA

创建项目时需要用到的框架有Java和Web

就像下图的进行勾选。

创建项目完成之后的目录

如下图所示。

创建项目时,gradle中用到的依赖:

// Java EE 通过本地Jar包导入
compile fileTree(dir:'lib',include:['*.jar'])
// Spring 框架
def springVersion = '4.3.10.RELEASE'
compile("org.springframework:spring-aop:$springVersion",
            "org.springframework:spring-orm:$springVersion",
            "org.springframework:spring-jdbc:$springVersion",
            "org.springframework:spring-instrument-tomcat:$springVersion",
            "org.springframework:spring-instrument:$springVersion",
            "org.springframework:spring-framework-bom:$springVersion",
            "org.springframework:spring-expression:$springVersion",
            "org.springframework:spring-core:$springVersion",
            "org.springframework:spring-context-support:$springVersion",
            "org.springframework:spring-context:$springVersion",
            "org.springframework:spring-beans:$springVersion",
            "org.springframework:spring-aspects:$springVersion",
            "org.springframework:spring-test:$springVersion",
            "org.springframework:spring-tx:$springVersion",
            "org.springframework:spring-web:$springVersion",
            "org.springframework:spring-webmvc:$springVersion",
            "org.springframework:spring-webmvc-portlet:$springVersion")
// 模拟测试框架
testCompile "org.mockito:mockito-core:2.+"
// 集成测试框架
testCompile 'org.testng:testng:6.8.17'
// 单元测试框架
testCompile group: 'junit', name: 'junit', version: '4.12'

还需要的框架有:Java EE

通过BeanFactory启动IOC容器

BeanFactory类是Spring框架下最核心的接口,它提供了高级的IOC配置机制。我们可以使用下面的XmlBeanDefinitionReader和DefaultListableBeanFactory类启动IOC容器。

在com.czuaphe.test包下,创建Car类

bean文件入在类路径(classpath)下

在Resource目录编写beans.xml文件生成实例Bean

然后,在test/java目录下,使用TestNG框架测试一个BeanFactoryTest测试类
通过加载Resource下的beans.xml文件启动IOC容器,得到实例Bean。

上图我们是通过类路径得到XML文件的,在gradle下,类路径就是resources目录下

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 通过类路径得到资源,以classpath:开头
Resource resource = resolver.getResource("classpath:beans.xml");

运行结果如下图所示:

bean文件放在文件系统(FileSystem)目录下

如果我们将beans.xml文件放在与Car类相同的路径下:

在test/java目录下,BeanFactoryTest类中的resouce变量只需要改变一下,就可以达到和上面一样的结果。

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource = resolver.getResource("file:src/main/java/com/czuaphe/test/beans.xml");

通过ApplicationContext类启动IOC容器

ApplicationContext类继承了BeanFactory类,实现了更多面向应用的功能。

我们就在上例的基础上,在test/java目录下,使用TestNG框架再编写一个ApplicationContextTest类。同样可以实现像上面两种加载XML文件启动IOC容器的方法,此外,ApplicatioinContext类还可以通过类注解的方式加载Bean启动IOC容器。

我们实现通过类注解的方式,实现启动IOC容器。首先,在com.czuaphe.test包下写Bean.java文件,编写实例化Bean的配置。

在ApplicationContextTest类下,实现通过加载类注解配置文件启动IOC容器。

另外两种通过ApplicationContext类启动IOC容器,也在注释中写出了。

通过类注解启动IOC容器,运行测试的结果如下图所示:

通过WebApplicationContext类启动IOC容器

WebApplicationContext类继承了ApplicationContext类,专门用于Web应用。启动方式也是通过Web容器启动,实现IOC容器的启动。不能简单通过Java代码实现启动。

在webapp/WEB-INF下的web.xml中定义ContextLoaderListener监听Web容器的启动,然后定义contextConfigLocation获得Spring框架的Bean配置文件。

然后在web.xml文件中,再定义一个Servlet,定义它的属性load-on-startup为1,表示在Web容器和Spring框架的IOC容器启动之后自启动,得到WebApplicationContext类的实例,就可以得到Bean实例了。

web.xml文件如下图所示

在com.czuaphe.webtest包下,编写SpringBeanServlet类,重写Servlet的init()方法,得到WebApplicationContext类的实例。

最后,对此项目配置Tomcat服务器,在启动Web容器时,就会启动Spring的IOC容器,而且会运行自定义的SpringBeanServlet,得到Bean实例。运行结果如下图所示:

总结

编写了三种IOC容器的启动方式,在非Web应用下,使用ApplicationContext启动IOC容器就已经足够使用,在Web应用下,就必须在web.xml文件中配置WebApplicationContext的启动。让Web容器启动时IOC容器也启动。BeanFactory类启动IOC容器一般不常用。

来自:https://blog.csdn.net/cuipp0509/article/details/78544497#%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE%E6%97%B6%E9%9C%80%E8%A6%81%E7%94%A8%E5%88%B0%E7%9A%84%E6%A1%86%E6%9E%B6%E6%9C%89java%E5%92%8Cweb

spring特点-AOP(面向切面示例)

什么是AOP?
基本概念
切面(aspect):横切关注点被模块化的特殊对象。
通知(advice):切面必须要完成的工作。切面中的每个方向称之为通知。通知是在切面对象中的。
目标(target):被通知的对象。
代理(proxy):向目标对象应用通知后创建的对象。

连接点(joinpoint):目标对象的程序执行的某个特定位置。如某个方法调用前,调用后的位置。包括两个信息:1.目标程序的哪个方法?2.方法执行
前还是执行后?
切点(pointcut):每个类会有多个连接点,AOP通过切点定位到特定的边接点。
类比,连接点相当于数所成方圆 中的记录,而切点相当于查询条件。一个切点匹配多个连接点。

 

使用XML配置的方法:

1.导入 spring包和aspectj的两个jar包

2.目标对象(要切入的对象)

首先为了不违反开闭原则和更好的可扩展性,目标对象实际上是实现了已定义好的某个接口

接口:

package com.itnba.test;

public interface IHuman {
    public void chifan();
    public void shuijiao();

}

实现接口的两个类:

package com.itnba.test;

import org.springframework.stereotype.Component;

public class Chinese implements IHuman {

    @Override
    public void chifan() {
        // TODO 自动生成的方法存根
        System.out.println("中国人吃饭");

    }
    
    @Override
    public void shuijiao() {
        // TODO 自动生成的方法存根
        System.out.println("中国人睡觉");
    }

}
package com.itnba.test;

import org.springframework.stereotype.Component;


public class American implements IHuman {

    @Override
    public void chifan() {
        // TODO 自动生成的方法存根
        System.out.println("美国人吃饭");

    }

    @Override
    public void shuijiao() {
        // TODO 自动生成的方法存根
        System.out.println("美国人睡觉");
    }


}

3.定义一个切面类

package com.itnba.test;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
public class Qiemian {
    
    public void chifanqian(){
        System.out.println("洗手");
    }
    public void chifanhou(){
        System.out.println("漱口");
    }
    public void shuijiaoqian(){
        System.out.println("洗澡");
        
    }

}

4.XML文件配置

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"
        default-autowire="byName"
        >
         <!-- 首相要实例化目标对象类和切面类 -->
        <bean id="chinese" class="com.itnba.test.Chinese"></bean>
        <bean id="american" class="com.itnba.test.American"></bean>
        <bean id="qiemian" class="com.itnba.test.Qiemian"></bean>
        
        <aop:config>
        <!-- 要切入的对象 -->                 
        <aop:pointcut expression="execution(* com.itnba.test.*.chifan(..))" id="chifan"/>
        <aop:pointcut expression="execution(* com.itnba.test.*.shijiao(..))" id="shijiao"/>
        <!-- 切入点 -->
        <aop:aspect id="ha" ref="qiemian"><!-- 切面类  -->
            <!--  <aop:之前before、之后after... method="切面类中的方法" pointcut-ref="上面的切入的对象"/>  -->
            <aop:before method="chifanqian()" pointcut-ref="chifan"/><!-- 之前通知 -->
            <aop:after method="chifanhou()()" pointcut-ref="chifan"/><!-- 之后通知 -->
            <aop:before method="shuijiaoqian()" pointcut-ref="shijiao"/>
        </aop:aspect>
    </aop:config>
</beans>

5.运行

package com.itnba.test;

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

public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //要用接口接收
        IHuman c= (IHuman)context.getBean("chinese");
        c.chifan();
        c.shuijiao();
        System.out.println("*********************************");
        //要用接口接收
        IHuman a= (IHuman) context.getBean("american");
        a.chifan();
        a.shuijiao();

    }

}

结果:(主要是第4步的xml配置中 ,引用 shuijiao  错打成了  shijiao)

使用注解的方法:

1.导入 spring包和aspectj的两个jar包

2.配置文件中加入aop命名空间

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.3.xsd" >

        <!-- 自动扫描包下的类,并将其实例化。多个包之间用,隔开 -->
        <context:component-scan base-package="com.itnba.test"></context:component-scan>
        <!-- 配置文件中启动AspectJ的注解功能 ,默认是false,要将其改为true -->
        <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> 
</beans>

3.目标对象(要切入的对象)

首先为了不违反开闭原则和更好的可扩展性,目标对象实际上是实现了已定义好的某个接口

接口:

package com.itnba.test;

public interface IHuman {
    public void chifan();
    public void shuijiao();

}

实现接口的两个类:

package com.itnba.test;

import org.springframework.stereotype.Component;

@Component
public class Chinese implements IHuman {

    @Override
    public void chifan() {
        // TODO 自动生成的方法存根
        System.out.println("中国人吃饭");

    }
    
    @Override
    public void shuijiao() {
        // TODO 自动生成的方法存根
        System.out.println("中国人睡觉");
    }

}
package com.itnba.test;

import org.springframework.stereotype.Component;

@Component
public class American implements IHuman {

    @Override
    public void chifan() {
        // TODO 自动生成的方法存根
        System.out.println("美国人吃饭");

    }

    @Override
    public void shuijiao() {
        // TODO 自动生成的方法存根
        System.out.println("美国人睡觉");
    }


}

4.定义一个切面类,直接在里面注解

package com.itnba.test;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Aspect //声明该类是切面类
@Component//配置文件中启动自动扫描功能
public class Qiemian {
    
    @Before("execution(* com.itnba.test.*.chifan(..))")//在那个方法的之前通知    *代表全部..代表所有形参,不管有多少
    public void chifanqian(){
        System.out.println("洗手");
    }
    @After("execution(* com.itnba.test.*.chifan(..))")//在那个方法之后通知
    public void chifanhou(){
        System.out.println("漱口");
    }
    @Before("execution(* com.itnba.test.*.shuijiao(..))")
    public void shuijiaoqian(){
        System.out.println("洗澡");
        
    }

}

5.写好后用main函数来运行一下

package com.itnba.test;

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

public class Test {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        Chinese c= context.getBean(Chinese.class);
        c.chifan();
        c.shuijiao();
        System.out.println("*********************************");
        American a= (American) context.getBean("american");
        a.chifan();
        a.shuijiao();

    }

}

结果:

这样,Spring的面向切面编程就简单介绍完了。

通知分类:
前置通知(@Before) — 在目标方法执行前执行的通知。
后置通知(@After) — 在目标方法执行后执行的通知。无论是否发生异常。后置通知中,无法读取目标方法返回的结果。
返回通知(@AfterReturnning) –在目标方法执行成功后执行的通知。在返回通知中可以访问目标返回结果的。
@AfterReturnning(value=”execution(* com.itnba..*(..))”,returning=”result”)
public void afterRun(Object result){
System.out.println(result);
}

异常通知(@AfterThrowing) — 在目标方法执行出错后执行的通知。
@AfterThrowing(value=”execution(* com.itnba..*(..))”,throwing=”ex”)
public void afterThrowing(Exception ex){
System.out.println(ex.getMessage());
}

环绕通知(@Around) — 需要切面方法携带ProceedingJoinPoion参数,类似于一个完整的动态代理,环绕通知必须要有一个返回值,是目标方法的返
回值。

@Around(“execution(* com.itnba..*(..))”)
public object aroundAdvice( ProceedingJoinPoint pjp){

object obj = null;
try{
//做前置通知
obj = pjp.proceed();
//做返回通知
}
catch(Exception ex){
//做异常通知
}
//做后置通知
return obj;
}

 

添加日志:

切面方法可以加入参数(JoinPoint) joinPost.getSignature().getXXX()获得相关方法信息
切面方法中可以加入Object参数,用来获得目标方法的返回值(只对返回通知起作用)

 

来自:https://www.cnblogs.com/hq233/p/6637488.html

spring特点-AOP

Spring AOP
1.1 面向切面编程基础
通常,系统由很多组件组成,每个组件负责一部分功能,然而,这些组件也经常带有一些除了 核心功能之外的附带功能 。系统服务如日志、事务管理和安全经常融入到一些其他功能模块中。这些系统服务通常叫做交叉业务,这是因为它们总是分布在系统的很多组件中。通过将这些业 务分布在多个组件中,给我们的代码引入了双重复杂性。
(1) 实现系统级业务的代码在多个组件中复制。这意味着如果你要改变这些业务逻辑,你就必须到各个模块去修改。就算把这些业务抽象成一个独立模块,其它模块只是调用它的一个方法,但是这个方法调用也还是分布在很多地方。
(2) 组件会因为那些与自己核心业务无关的代码变得杂乱。一个向地址录中添加条目的方法应该只关心如何添加地址,而不是关心它是不是安全或支持事务的。
此时,我们该怎么办呢?这正是AOP用得着的地方。AOP帮助我们将这些服务模块化,并把它们声明式地应用在需要它们的地方,使得这些组件更加专注于自身业务,完全不知道其它涉及到的系统服务。
这里的概念切面,就是我们要实现的交叉功能,是应用系统模块化的一个方面或领域。切面的 最常见例子就是日志记录。日志记录在系统中到处需要用到,利用继承来重用日志模块是不合适的,这样,就可以创建一个日志记录切面,并且使用AOP在系统中 应用。下图展示了切面应用方式

图表 1 应用切面
其中,通知Advice是切面的实际实现。连接点Joinpoint是应用程序执行过程 中插入切面的地点,这个地点可以是方法调用,异常抛出,甚至可以是要修改的字段,切面代码在这些地方插入到你的应用流程中,添加新的行为。切入点 Pointcut定义了Advice应该应用在那些连接点,通常通过指定类名和方法名,或者匹配类名和方法名式样的正则表达式来指定切入点。
1.2 AOP在Spring中的实现
基于AOP,业界 存在各种各样的AOP实现,比如,JBoss AOP、Spring AOP、ASP ectJ、 Aspect Werkz等。各自实现的功能也不一样。AOP实现的强弱在很大程度上取决于连接点模型。目前,Spring只支持方法级的连接点。这和一些其他AOP框 架不一样,如AspectJ和JBoss,它们还提供了属性接入点,这样可以防止你创建特别细致的通知,如对更新对象属性值进行拦截。然而,由于 Spring关注于提供一个实现J2EE 服务的框架,所以方法拦截可以满足大部分要求,而且Spring的观点是属性拦截破坏了封装,让Advice触发在属性值改变而不是方法调用上无疑是破坏了这个概念。
Spring的AOP框架的关键点如下:
(1)Spring实现了AOP联盟接口。在Spring AOP中,存在如下几种通知(Advice)类型
Before通知:在目标方法被调用前调用,涉及接口org.springFramework .aop.MethodBeforeAdvice;
After通知:在目标方法被调用后调用,涉及接口为org.springframework.aop.AfterReturningAdvice;
Throws通知:目标方法抛出异常时调用,涉及接口org.springframework.aop.MethodBeforeAdvice;
Around通知:拦截对目标对象方法调用,涉及接口为org.aopalliance.intercept.MethodInterceptor。
(2)用Java 编写Spring通知,并在Spring的配置文件中,定义在什么地方应用通知的切入点。
(3)Spring的运行时通知对象。代理Bean只有在第一次被应用系统需要的时候才 被创建。如果你使用的是ApplicationContext,代理对象在BeanFactory载入所有Bean的时候被创建。Spring有两种代理 创建方式。如果目标对象实现了一个或多个接口暴露的方法,Spring将使用JDK 的 java.lang.reflect.Proxy类创建代理。这个类让Spring动态产生一个新的类,它实现所需的接口,织入了通知,并且代理对目标对 象的所有请求。如果目标对象没有实现任何接口,Spring使用CGLIB库生成目标对象的子类。在创建这个子类的时候,Spring将通知织入,并且将 对目标对象的调用委托给这个子类。此时,需要将Spring发行包lib/cglib目录下的JAR文件发布到应用系统中。
1.3 Spring AOP的优势
借助于Spring AOP,Spring IoC能够很方便的使用到非常健壮、灵活的企业级服务,是因为Spring AOP能够提供如下几方面的优势:
(1)允许开发者使用声明式企业服务,比如事务服务、安全性服务;EJB 开发者都知道,EJB组件能够使用J2EE容器提供的声明式服务,但是这些服务要借助于EJB容器,而Spring AOP却不需要EJB容器,借助于Spring的事务抽象框架就可以这些服务。
(2)开发者可以开发满足业务需求的自定义切面;
(3)开发Spring AOP Advice很方便。因为这些AOP Advice仅是POJO类,借助于Spring提供的ProxyFactoryBean,能够快速的搭建Spring AOP Advice。

spring特点-IOC

IoC 与 DI
首先想说说 IoC ( Inversion of Control ,控制倒转)。这是 spring 的核心,贯穿始终。所谓 IoC ,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和 对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的 mm ,然后打听她们的兴趣爱 好、 qq 号、电话号、 ip 号、 iq 号 ……… ,想办法认识她们,投其所好送其所要,然后嘿嘿 …… 这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传 统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己 new 一个,或者从 JNDI 中查询一个),使用完之后还要将对象销毁(比 如Connection 等),对象始终会和其他的接口或类藕合起来。
那么 IoC 是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚 介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我 们的要求,提供一个 mm ,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控 制,而是有婚介这样一个类似容器的机构来控制。 Spring所倡导的开发方式就是如此,所有的类都会在 spring 容器中登记,告诉 spring 你是个什 么东西,你需要什么东西,然后 spring 会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring 来控制,也就是说控制对象生存周期的不再是引用它的对象,而是 spring 。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象 都被 spring 控制,所以这叫控制反转。如果你还不明白的话,我决定放弃。
IoC 的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过 DI ( Dependency Injection ,依赖注入)来实现的。比如对象 A 需要操作数据库,以前我们总是要在 A 中自己编写代码来获得一个 Connection 对象,有了 spring 我们就只需要告诉 spring , A 中需要一个 Connection ,至于这个 Connection 怎么构造,何时构造, A 不需要知道。在系统 运行时,spring 会在适当的时候制造一个 Connection ,然后像打针一样,注射到 A 当中,这样就完成了对各个对象之间关系的控制。 A 需要依赖 Connection 才能正常运行,而这个 Connection 是由 spring 注入到 A 中的,依赖注入的名字就这么来的。那么 DI 是如何实现的呢? Java 1.3 之后一个重要特征是反射( reflection ),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性, spring 就是通过反射来实现注入的。关于反射的相关资料请查阅 java doc 。

IoC 是一个很大的概念,可以用不同的方式来实现。主要的实现形式有两种 :
依赖查找:容器提供回调接口和上下文环境给组件。 EJB 和 Apache Avalon 都是使用这种方式。
依赖注入:组件不做定位查询,只是提供普通的 Java 方法让容器去决定依赖关系。容器全权负责组件的装配,它会把符合依赖关系的对象通过 JavaBean 属性或者构造子传递给需要的对象。通过 JavaBean 属性注射依赖关系的做法称为设值方法注入( Setter Injection );将依赖关系作为构造子参数传入的做法称为构造子注入( Constructor Injection )。
附图说明:

到这里,大家应该对 IoC 与 DI 都有了初步的认识了。其实就 Spring 来说,就是 JavaBean 由 Spring 来管理组装,表面上看就少了几个 new 字,其实就是为了降低耦合度,这也是我们做软件的目标之一。
至于 Spring 是怎样实现 IoC 的, 《 expert one-on-one J2EE Development without EJB 中文版》第七章“ Spring 框架介绍”很详细的列举了多种方法。说实在,一下子看这么多,我真有点糊涂了。我还是自己写个 Demo 熟悉一下大名鼎鼎的 Spring 吧。
首先得下载 Spring 。 Spring 网上有两种 Spring 包一种是 spring-framework-1.2.6-with-dependencies.zip ,另一种是spring-framework-1.2.6.zip 。当然最好是下载 spring-framework-1.2.6-with-dependencies.zip 形式的,因为里面包括了更多的东东。 spring-framework-1.2.6-with-dependencies.zip 的下载地址是:http://prdownloads.sourceforge.net/springframework/spring-framework-1.2.6-with-dependencies.zip 。
下载下来,解压后,你会发现里面有很多 jar 文件。因为刚刚接触 Spring ,因此我只需要 spring-core.jar ( spring-framework-1.2.6\dist ),将其导入 eclipse 的构建路径中。另外, log 日志是需要的,这也是为了养成良好的编程习惯。将 log4j-1.2.9.jar ( spring-framework-1.2.6\lib\log4j )和 commons-logging.jar ( spring-framework-1.2.6\lib\jakarta-commons )导入到构建路径中。
准备就绪,开始写 Demo 了。
我的工程的结构是:

<!– [if !supportLists]–>1、 <!– [endif]–>log4j.properties 代码:
<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–>log4j.rootLogger = Debug, stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =% c{ 1 }  –   % m % n

如何使用 Log4j ,请看我的另一篇转贴的文章: 如何使用 Log4J 。

<!– [if !supportLists]–>2、 <!– [endif]–>HelloBean 的代码:
<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–>package  com;

public   class  HelloBean {
private  String helloworld = ” Hello!World! ” ;

public  String getHelloworld() {
return  helloworld;
}

public   void  setHelloworld(String helloworld) {
this .helloworld  =  helloworld;
}
}

这是一个简单的 JavaBean ,有个 String 类型的 helloworld 属性,初始值是 “Hello!World!” 。
<!– [if !supportLists]–>3、 <!– [endif]–>Bean.xml 代码:
<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–><? xml version = ” 1.0 ”  encoding = ” GBK ” ?>
<! DOCTYPE beans PUBLIC  ” -//SPRING/DTD BEAN/EN ”
” http://www.springframework.org/dtd/spring-beans.dtd ” >

< beans >
< bean id = ” helloBean ”   class = ” com.HelloBean ” >
< property name = ” helloworld ” >
< value > Hello ! Rick </ value >
</ property >
</ bean >
</ beans >

Spirng重点之一就是配置文件,上面是个相当简单的配置文件,我想大家都应该看得懂。最后就是写应用程序了。
4、 <!– [endif]–>Test 的代码:

<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–>package  com;

import  org.springframework.beans.factory. * ;
import  org.springframework.beans.factory.xml.XmlBeanFactory;
import  org.springframework.core.io.ClassPathResource;
import  org.springframework.core.io.Resource;

public   class  Test {

public   static   void  main(String[] args) {
// 实例化JavaBean,主要是为了比较new对象和依赖注入两者的区别
HelloBean hellobean = new  HelloBean();
System.out.println(hellobean.getHelloworld());

// 通过Spring访问JavaBean组件
Resource resource = new  ClassPathResource( ” com/bean.xml ” );
BeanFactory factory = new  XmlBeanFactory(resource);
hellobean = (HelloBean)factory.getBean( ” helloBean ” );
System.out.println(hellobean.getHelloworld());
}
}
这个Demo很好的阐述了Spring的Ioc,其实就Spring而言,就是通过配置文件,让Spring如同一个管家一样来管理所有的Bean类。

Spring的依赖注入相对复杂一点,主要是明白调用别的Bean,不是通过实例化对象来调用,而是告诉Spring,我需要什么Bean,然后Spring再向你的Bean里面注入你所需要的Bean对象。
接下来说说代码实现,我只是在刚刚的例子上再添加一点东东。
首先要增加一个HelloImp的接口,这是问什么呢,那你得问Spring,它定的规矩:JavaBean的实现要有两个部分,一个接口,一个默认实现。你不照做就不行。
HelloImp代码:

<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–>package  com;

public   interface  HelloImp {
public   void  getName();
}

实现HelloImp的Hello代码:

<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–>package  com;

public   class  Hello  implements  HelloImp {
public   void  getName(){
System.out.println( ” Jack ” );
}
}

接着就是在 HelloBean 中调用 Hello 了。 Spring 的不同之处也在这体现出来。
<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–>package  com;

public   class  HelloBean {
private  String helloworld = ” Hello!World! ” ;
private  HelloImp hello;    // 注意这个私有对象是借口

public  String getHelloworld() {
return  helloworld;
}

public   void  setHelloworld(String helloworld) {
this .helloworld  =  helloworld;
}

public   void  setHello(HelloImp hello) {
this .hello  =  hello;
}

public   void  get(){
this .hello.getName();
}
}
注意字体加粗的地方。

配置文件也需要增加一点东西:

<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–><? xml version = ” 1.0 ”  encoding = ” GBK ” ?>
<! DOCTYPE beans PUBLIC  ” -//SPRING/DTD BEAN/EN ”
” http://www.springframework.org/dtd/spring-beans.dtd ” >

< beans >
<! —注意引用的类是具体的类Hello –>
< bean id = ” myHello ”   class = ” com.Hello ” >
</ bean >
< bean id = ” helloBean ”   class = ” com.HelloBean ” >
< property name = ” helloworld ” >
< value > Hello ! Rick </ value >
</ property >
< property name = ” hello ” >
< ref bean = ” myHello ” ></ ref >
</ property >
</ bean >
</ beans >

注意字体加粗的部分。

最后在 Test 中添加一句 hellobean.get(); 就可以看到结果了。

<!– <br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>–>package  com;

import  org.springframework.beans.factory. * ;
import  org.springframework.beans.factory.xml.XmlBeanFactory;
import  org.springframework.core.io.ClassPathResource;
import  org.springframework.core.io.Resource;

public   class  Test {

public   static   void  main(String[] args) {
HelloBean hellobean = new  HelloBean();
System.out.println(hellobean.getHelloworld());

Resource resource = new  ClassPathResource( ” com/bean.xml ” );
BeanFactory factory = new  XmlBeanFactory(resource);

hellobean = (HelloBean)factory.getBean( ” helloBean ” );
System.out.println(hellobean.getHelloworld());
hellobean.get();
}
}

到这,Spring的IoC和DI总算有了一定的认识,也算是敲开了Spring的大门了。
来自:https://blog.csdn.net/qq_27298687/article/details/52958368

spring入门概述-spring框架简介

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

在这篇由三部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的角度描述该框架的功能,然后将讨论两个最有趣的模块:Spring 面向方面编程(AOP)和控制反转 (IOC) 容器。接着将使用几个示例演示 IOC 容器在典型应用程序用例场景中的应用情况。这些示例还将成为本系列后面部分进行的展开式讨论的基础,在本文的后面部分,将介绍 Spring 框架通过 Spring AOP 实现 AOP 构造的方式。

请参阅 下载,下载 Spring 框架和 Apache Ant,运行本系列的示例应用程序需要它们。

Spring 框架

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。

图 1. Spring 框架的 7 个模块

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  • 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
  • Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
  • Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
  • Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
  • Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
  • Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
  • Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

IOC 和 AOP

控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。

在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。

Spring 框架的 IOC 容器采用类型 2 和类型3 实现。

面向方面的编程

面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。

AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。

AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。

IOC 容器

Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

BeanFactory 支持两个对象模型。

  • 单态 模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。
  • 原型 模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。

BeanFactory 接口

因为 org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。

BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));

在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。

MyBean mybean = (MyBean) factory.getBean("mybean");

每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBeanFactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。

IOC 示例

理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。

我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:

  • 信用级别评定服务,查询用户的信用历史信息。
  • 远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的话)。
  • 电子邮件服务,向用户发送有关信用卡状态的电子邮件。

三个接口

对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。

清单 3. CreditRatingInterface
public interface CreditRatingInterface {
   public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
}

清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是由 CreditRating 类提供的。

清单 4. CreditLinkingInterface
public interface CreditLinkingInterface {
public String getUrl();
        public void setUrl(String url);
        public void linkCreditBankAccount() throws Exception ;
}

信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 getUrl() 方法进行的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该接口的实现是由 CreditLinking 类提供的。

清单 5. EmailInterface
public interface EmailInterface {
      public void sendEmail(ICustomer iCustomer);
      public String getFromEmail();
      public void setFromEmail(String fromEmail) ;
      public String getPassword();
      public void setPassword(String password) ;
      public String getSmtpHost() ;
      public void setSmtpHost(String smtpHost);
      public String getUserId() ;
      public void setUserId(String userId);
   }

EmailInterface 负责向客户发送关于客户信用卡状态的电子邮件。邮件配置参数(例如 SMPT 主机、用户名、口令)由前面提到的 bean 配置机制设置。Email 类提供了该接口的实现。

Spring 使其保持松散

这些接口就位之后,接下来要考虑的就是如何用松散耦合方式将它们集成在一起。在 清单 6 中可以看到信用卡帐户用例的实现。

注意,所有的 setter 方法都是由 Spring 的配置 bean 实现的。所有的依赖关系 (也就是三个接口)都可以由 Spring 框架用这些 bean 注入。createCreditCardAccount() 方法会用服务去执行其余实现。在 清单 7 中可以看到 Spring 的配置文件。我用箭头突出了这些定义。

运行应用程序

要运行示例应用程序,首先必须 下载 Spring 框架 及其所有依赖文件。接下来,将框架释放到(比如说)磁盘 c:\,这会创建 C:\spring-framework-1.2-rc2 (适用于当前发行版本) 这样的文件夹。在继续后面的操作之前,还必须下载和释放 Apache Ant

接下来,将源代码释放到文件夹,例如 c:\ 盘,然后创建 SpringProject。将 Spring 库(即 C:\spring-framework-1.2-rc2\dist 下的 spring.jar 和 C:\spring-framework-1.2-rc2\lib\jakarta-commons 下的 commons-logging.jar)复制到 SpringProject\lib 文件夹中。完成这些工作之后,就有了必需的构建依赖关系集。

打开命令提示符,将当前目录切换到 SpringProject,在命令提示符中输入以下命令:build

这会构建并运行 CreateCreditAccountClient 类,类的运行将创建 Customer 类对象并填充它,还会调用 CreateCreditCardAccount 类创建并链接信用卡帐户。CreateCreditAccountClient 还会通过 ClassPathXmlApplicationContext 装入 Spring 配置文件。装入 bean 之后,就可以通过 getBean() 方法访问它们了,如清单 8 所示。

清单 8. 装入 Spring 配置文件
ClassPathXmlApplicationContext appContext = 
                    new ClassPathXmlApplicationContext(new String[] {
     "springexample-creditaccount.xml"
    });
CreateCreditCardAccountInterface creditCardAccount = 
                    (CreateCreditCardAccountInterface)
    appContext.getBean("createCreditCard");

结束语

在这篇由三部分组成的 Spring 系列 的第一篇文章中,我介绍了 Spring 框架的基础。我从讨论组成 Spring 分层架构的 7 个模块开始,然后深入介绍了其中两个模块:Spring AOP 和 IOC 容器。

由于学习的最佳方法是实践,所以我用一个工作示例介绍了 IOC 模式 (像 Spring 的 IOC 容器实现的那样)如何用松散耦合的方式将分散的系统集成在一起。在这个示例中可以看到,将依赖关系或服务注入工作中的信用卡帐户应用程序,要比从头开始构建它们容易得多。

请继续关注这一系列的下一篇文章,我将在这里学习的知识基础上,介绍 Spring AOP 模块如何在企业应用程序中提供持久支持,并让您开始了解 Spring MVC 模块和相关插件。

下载资源

来自:https://www.ibm.com/developerworks/cn/java/wa-spring1/

access踩坑-数据库连不上因后缀名擅自改了

曾经在做 java 练手时,有一个 功能是 数据库连接  操作 access 数据。因为当时  数据库是 accdb后缀。但是 不兼容 旧版的 ,所以 就改成了 mdb 后缀。用软件 打开是没有问题的,但是用程序连接时,连接 mdb 文件,一直表示 连接不上。所以要注意 了啊。

坑爹生活反思-买眼镜时记得别买塑料镜架

楼主去买眼镜时,一开始 买了 塑料的镜架,后来 掉皮了,然后 不小心  镜架尾 断了。所以 用 重新  买了 镜架。

===================================

相信大家都不太分得清板材眼镜架和塑料眼镜架,毕竟不是内行人。板材眼镜架和塑料眼镜架,看起来都一样,傻傻分不清楚。怎么区分眼镜架是板材的还是塑料的?小编来教大家。

宝姿 POU13501 男女通用 眼镜框 BK1黑框花腿

板材眼镜架

是由原材料加工压制板状后再重新切割打磨抛光而成,板材眼镜架密度高,由于板材眼镜架生产工艺复杂而生产成本较高,所以价格会比塑料镜架高许多。注意看,板材眼镜架在镜架边缘是没有注塑点的,而且有明显被切割过的纹理痕迹。

塑料眼镜架(又称注塑架)

博柏利 B2199-F 男士 眼镜框 3002玳瑁

是首先制作好模具,然后再注入液体塑料,冷却后再电镀上色,塑料眼镜架密度低,所以容易断裂。由于塑料眼镜架生产工艺简单,生产成本低,可以大量生产,所以款式变化很多,由于是电镀上色,所以花样繁多,色彩比板材架鲜艳多彩。请注意,塑料架一般都有注塑点,就是在镜架边缘留下一个小疤痕一样的点,而且塑料架会比板材眼镜架轻很多很多。

所以,板材眼镜架由于材料密度高,所以拿在手里比较重,扎实,手感较好。而塑料架由于材料密度低,所以比起板材架要轻很多。

同时,板材架镜腿里面的金属条,普遍较粗,而大部分塑料架的镜腿里面是没有金属条的,有少部分的塑料架镜腿里面虽然有金属条,但几乎都很细小,而且主要是圆形。

怎么区分眼镜架是板材的还是塑料的,这个新技能,你get到了吗?

=========================================

 

所有戴眼镜的人都会有种疑惑甚至愤怒:构造简单、技术成熟的眼镜,为何动辄500、高达数千??

我也疑惑,虽然我在眼镜行业好几年

但是,戴眼镜的朋友,却对眼镜知识、镜片知识、验光知识、行业情况、却又一无所知

信息不对称,造成了顾客和商家之间的鸿沟

互联网已经改变了书籍的销售模式,它会改变眼镜行业吗??

我想:首先,就是要把镜架、镜片、验光、行业内情等基本知识,准确的传达的总结给戴眼镜的人

只有信息对称,才能改变这个行业

朋友,我也是戴眼镜的人,先别忙着判断,看几条吧

如果这些知识对你有用,说到你心坎里,请给个顶字

我会写的很简明扼要,你花很小时间浏览,就能心里有数,毕竟,你无需掌握太

细:如钛架如何连铸压铸成钛条或钛片,又如何冲压、之后如何成型、如何电镀、

如何冷焊等,那就过了

放心吧,先让你很简单、很快的学完镜架镜片验光等核心知识,

我会告诉你整个行业全国的配镜现状,各类优劣,但是不能提名啊,一是避广告之嫌,二是论坛的老规矩大家都知道。
在眼镜行业工作多年后,我深知昂贵的店租和人工,是一副眼镜动则几百上千,顾

客叫苦连天的真正原因

最大的难题就是顾客大多不懂眼镜,不懂镜片,不懂镜架好坏,不懂验光

一句话,好眼镜和烂眼镜,很多顾客分辨不出来

只是店员说啥就是啥

所以我决心把那些很简单的分辨知识写出来

如果你戴眼镜,也是这样

请顶顶我,让更多人看到

第一章 眼镜知识提纲

接着我会从以下多个方面来向大家普及相关眼镜知识和一些行业现象,欢迎

各位眼镜人踊跃发问。
1 镜架目前的分类,各类镜架的材质和特点
2 一副好镜架如何辨别
3 中国几个地方产的镜架的特色
4 所谓名牌尾货的镜架(如同LV尾货)的真实内幕
5 镜片的分类
6 店里常见的镜片的特点
7 镜片好坏如何辨别
8 店里最后给你配的镜片,如何确保货要对板
9 镜片的日常维护与误区

看完这些,你就能辨别一副眼镜的好坏,而不是随便听推荐。

中间当然可能会穿插各种因为很多网友的问题而引申出来的很多信息。

第二章 中国镜架生产、质量、分布等大致情况

中国其实是眼镜生产大国,几个生产集散地的状况

—配镜时,问清楚,你的眼镜,是温州、丹阳、还是深圳横岗产的

中国是全世界最大的眼镜生产国和出口国,全球80%的眼镜,都是中国生产

但高端的眼镜镜架,设计和品牌在境外,国内的工作来加工

中国的眼镜分布在:

丹阳:江苏的丹阳,主要是生产批量大、价格低的镜架,出口到国外,国内也有大量的销售

丹阳品质就一定低吗?? 其实眼镜镜架,质量都过关,特别是镜架,主要是材质、电镀、加工等,价格低,不一定品质差,但丹阳,是低价低品质的代名词,跟事实上不是如此

温州:浙江温州,各位都会有印象,他们的路线和丹阳,基本是同类

深圳: 就是这! 生产这全球80%的高级眼镜,价格也高很多,当然,深圳就集中在横岗、有不少港资、台资的工厂,他们由于成本也高,价格也好,因此,用材比较好、技工设备也先进,因此,是全球高级眼镜的生产地

镜片:中国的镜片大厂,大部分集中在上海、江苏、浙江一带,下回重点说说镜片

因此,其实眼镜架,本身不是一个高科技的产品,而且中国工业发展这么多年,对于这类金属和塑胶加工工艺,涉笔和技术,都很成熟,所以,只是用材不一样,和材料成本不一样,以及生产手工和工艺,不同品种会有不同的区别

这是生产分布的情况—中国式眼镜大国

你的理解这些,大致就知道店里的货品情况。

第三章 镜架的材质和品质眼镜框材质总的来说分金属类和塑料两大类

金属类分为:钛材质和合金材料,不锈钢材质

塑胶类分为:厚重的板材、轻薄的TR材质、最近才开始的ULTEAM材料,以及其他

塑胶制品类眼镜

钛材质分为:合金钛、纯钛、B钛(超薄超轻)

总之,目前就材料档次而言,超薄B钛材的档次最高、纯钛其次、板材类为:超轻

薄的ULTEAM材料(美国通用的材料,韩国生产,国内还生产不好),板材次之

但从工艺和做工方面,又不一定最好的材质,一定是最贵的眼镜,有的名牌眼镜,

就是塑胶板材,但每个细节很完美,也很昂贵

市面上流行过一种说法,说中国丹阳的眼镜按斤卖,下面是我整理的一点信息,希

望看完后,让大家知道:

镜架是贴脸的,涉及美观、气质和健康

也让大家知道,垃圾的东西,不是最好的选择

还有,镜架,特别是好的镜架,不是传说中的那么的廉价:

第四章 镜架分类之一:钛架
我一直认为,今后金属架里面,钛架会成为主流,一是生物相容,二是轻巧,三是档次。店里开价800或1000以上的,也多是钛架

但是,钛架和钛架的差别,可是大的去了

1 目前最贵最好的钛架:B钛,超薄、超轻,但是加工难度大、成型难度大,需要

更好的设备和更高的坏品率,所以成本也相对是最高的,一个超薄超轻的钛片架子,大

点的店面,都1500以上了,如果有点品牌,更高

2 纯钛:一般以钛柱子的形式出现,比其他金属轻很多,但比钛片重,形状也没有

片状的好看,这是很多店里的主流的钛产品

3 合金钛:就是钛和其他金属的合金,很多是比较低端的钛产品,但也有做的好

的,我是说大致的情况

钛为啥贵,他的好处是什么呢?

1 轻薄: 眼镜的轻薄,一定是个趋势,毕竟戴在眼睛上的东西,但无框眼镜,又

不是每个人喜欢的,不同的气质,因此,半框和全框眼镜,钛是最好的选择之一

2 安全:生物相容性,钛是比较好的,就是对人体无害或者伤害最小—-还记得

早年我们戴的眼镜的那种铜绿吗? 其实不好的镜架,对人体是有害的

记住了,钛是金属的首选(当然你不喜欢,喜欢其他金属也没有问题),钛也最

贵,所以要搞清楚再下手!

店面贵,是因为成本太高,其实合理的价格,也不用那么贵。

第五章镜架之塑胶架

1 塑胶大类:塑胶是个很广泛的含义,非金属的镜架,基本就是塑胶大类的

A 传统的塑胶,就是板材,很厚的那种,当然做的好的,也很有气质,但

是还是很重,塑胶和金属铰链,有时候容易坏—但板材,还是目前普通眼镜的主

流之一

B TR90:是今年韩国兴起的新材料,很轻、很软、不伤人,可以是黑色的、

可以是透明的,TR90为韩国做的最好,很多韩剧里面,那些看起来很轻的眼镜

其实就是TR90的材料

—在十年面上,现在大部分是中国生产的TR90,确实工艺方面和材质方面,

比不过韩国,但是成本低,大部分店里,都卖国产的,同样配一副,利润高很多,

而顾客,根本不明白韩国产和中国产。

C ULTEM材料:是一种美国通用的航空材料,比TR更轻更柔然,很适合

接触批发,遗憾,又是韩国和日本最早生产,当然成本也比较高,大约2011年

底才开始来到中国,目前可以说很多内地的店面,根本店主都没听说过ULTEM

材料,UTLEA对人体伤害最小,当然,和皮肤接触,一般的健康材料,都问题

不大。

镜腿用塑料的(所谓的板材)我觉得相对来还是最安全,塑料这种东东做成

无毒是完全有可能的,但是你用的是不是无毒的我不知道。

第十章 怎样辨别镜片的好坏

怎么买镜片以及怎么判断镜片的质量

我们配镜的时候,很多人根本都没看镜片的包装、品名、日期、等,因为都是加

工好的
—建议下次配镜,一定好好看看,最好网络上查查,这个牌子的,哪儿产的,

是否有防伪等,

虽然你说没用,但是,多了解一下,特别是让店里把包装和查询防伪等给你

留着,也是一点监督吧

戴2年的眼镜,自己的镜片是哪儿产的、什么折射率、啥都不知道,光知道

花了400还是800

这可是有点荒唐!!

当然,肉眼是很难判断一个镜片的好坏的,只能从以下几个方面来看:

1 看看整体包装:让他给你看看镜片的整体包装,感受一下
2 看看出厂地点:出厂在中国、还是进口、是中国上海,还是中国浙江等,
3 看看防伪标志:防伪标志,不一定意味着就是好东西,但看看,把握一下
4 看看生产工厂:查询下生产工厂,地址、新闻等等

总之,镜片的判断,普通消费者很难,但你提出这些要求,店家至少会认为你比较专业,因此,不太敢给你弄低质的冒充高质的

眼镜行业是有些奇怪。顾客和商家,互相不信任,互相埋怨,甚至,顾客仇视商家

这一切,都应该从普及一些知识来开始

知己知彼,百战不殆第十一章 镜片的加工

镜片的加工:也就是打磨和安装,这点大家不要担心,现在都是比较自动化的设

备,并且,深圳大部分眼镜店,自己都不可能设独立的加工,都是第三方加工的,

所以品质都不会有什么大问题。眼镜片是否舒服其实取决于制镜师的本事。看现

在很多学生从一二百度一步步涨到六七百度,除与现在学业重有关外,与验光结

果不准,制镜不合理有绝对大的关系。

同样一副镜片,同样一个验光结果(后面我会专门讲讲验光的知识),不同

的制镜师用不同的工具做出来,效果是完全不一样的。

现在大店都是使免模的全自动机器,一体成型,制作精度基本可以满足用户

需要。

而大多数中档店都是使的手工模板的全自动机器,日本产的还行,国产的基

本上都有跑轴,左右不对称的现象,做出的镜片不敢否定也不敢肯定,碰吧。

至于小店拿手工轮,钳子做出的镜片,那你就别想了,想准那才怪呢。有人

说了,那小店不错呀,我都做好多年了,也挺舒服的。

你知道吗,人眼是人体内调节力最强的一个器官,你的眼睛适应他的眼镜了,

呵呵。

要想准,特别是有散光的,你一定要选半框拉丝的镜子,因为那是一体成型,

可以保障一点误差没有的。打孔的需要手工装配,极易偏差,全框很多时候也需

要手工磨边,有错的可能性。

因此,眼镜加工,也是眼镜的重要环节

有时候,你如果问店家,你什么时候可以做好,他说一天后,肯定是送到加工中心去加工,其实那里有最好的设备,最有保障

他如果说立等可取,一个店面都配一个20万的依视路全自动仪是不切实际的,他用什么加工我不敢推测,但是个人觉得,还是要求他去加工中心去加工

第十二章 镜片的维护和保养

你的镜片关键在保养和维护,保养好了,一般的镜片,2年是必须更换的,保养

不好的一年就会影响视力,应该更换了。你要是不换,磨花严重的后果,就是每

天跟随你的–杀手!

清洗:注意清洗的方式,超声波天天清洗是不现实的,就用水洗,但擦拭多注意

放置:最好不要让镜片接触硬物,侧面放置在桌台上,这个道理都懂

如果路过大店,有空的话,请他们洗洗眼镜,他们都是超声波清洗,比较彻底,基

本都是免费的

眼镜一旦刮花了,一定要注意,如果刮花严重,一定要及早更换,可以少吃一次西

餐,但千万不能忽视镜片

—镜片:灵魂、灵魂、灵魂

多关心下每天跟着你的那个镜片吧

 第十四章镜片、镜架、验光大总结

写了很多天了,我把之前的东西总结一下
1 中国眼镜大国,理论上供应资源丰富,但眼镜很贵,都是门店和人工、加上门店太多,每家店面做的生意太少,这就是真正的原因

2 好的镜架,要看材质、看做工、看细节、看整体风格设计等,比如,一个LOGO印刷的非常精美的镜架,他的材质做工,基本都不会差,而一个OSS镜架(BOSS没印刷好,B掉了,成了OSS),这样的山寨假名牌,他品质好不到哪儿去—明白了吗?

3 镜片好坏,只能问指标,肉眼很难辨别,但可以通过细节,看包装、看印刷、看厂家状态等,来基本判断你的镜片,还有一半的度数,无需过高折射率的镜片

4 验光是核心的环节,千万不能马虎,争取找有经验的人给你验光,而有经验的验光师,专业的人,在哪儿,如果店面你有把握,当然可以,医院个人觉得更靠谱一些,但是医生也有不良的,自己多当心

5 眼镜的保养,特别是镜片的保养,很重要,刮花了之后,一定要重视,严重的,要更换,刮花的眼镜,对自己视力伤害太大了

6 眼镜这个行业,和其他行业一样,有黑幕、有猫腻,也有真诚、有诚信,关键看你自己懂不懂,如果自己基本懂,懂行情,走到哪儿,都吃不了亏

mac踩坑-maven环境变量因文件夹隐藏后缀而写错

在mac 下 按照正常方式:配置maven 环境变量。

vim ~/.bash_profile

export JAVA_6_HOME=`/usr/libexec/java_home -v 1.6`
# 设置 JDK 7
export JAVA_7_HOME=`/usr/libexec/java_home -v 1.7`
# 设置 JDK 8
export JAVA_8_HOME=`/usr/libexec/java_home -v 1.8`

#默认JDK 7
export JAVA_HOME=$JAVA_7_HOME

#alias命令动态切换JDK版本
#alias jdk6="export JAVA_HOME=$JAVA_6_HOME"
alias jdk7="export JAVA_HOME=$JAVA_7_HOME"
#alias jdk8="export JAVA_HOME=$JAVA_8_HOME"

export M3_HOME=/Users/toy/Documents/maven/apache-maven-3.5.3
export PATH=$PATH:$M3_HOME/bin

export PATH=$PATH:"/Library/Tomcat/my_script_diy":"/Library/Tomcat/home/bin":"/usr/local/mysql/bin":"/Users/toy/Library/Android/sdk/platform-tools"
~                                                                               
~

注意配置路径的时候,路径名可以加分号,也可以不加。
export PATH 可以操作多次的。

编辑完maven后,保存。用命令行查看效果。

echo $PATH

/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/toy/Documents/maven/apache-maven-3.5.3/bin:/Library/Tomcat/my_script_diy:/Library/Tomcat/home/bin:/usr/local/mysql/bin:/Users/toy/Library/Android/sdk/platform-tools

然后 立即生效环境变量:
source ~/.bash_profile


正常情况下,应该没有问题了。

但是出现了 command not found 问题。我看 了一下,系统环境变量 路径都对的 啊。然后 进行排错。

1、文件权限,改完没有用

2、文件路径 改成了 Library 库目录里面,没有用。

3、利用Finder   go to folder  居然可以找到的。感觉路径的确没有问题啊 。

 

4.将 执行文件托人 terminal 中 发现 路径居然 有问题啊,问题的 关键找到了,

 

当时 原来是隐藏了 后缀名啊,巨坑。没想到 隐藏后缀名也能 用 Finder 搜索的到。坑爹。

mac常用操作-配置环境变量

经过测试 环境变量 配置时, 填写应用路径时 加双引号和 不加 双引号 都没有问题。
一、打开terminal,输入  echo $PATH  ,按回车执行命令查看当前变量值,这里我们将修改PATH变量来测试。

toydeMacBook-Pro:~ toy$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/toy/Library/maven/apache-maven-3.5.3/bin:/Library/Tomcat/my_script_diy:/Library/Tomcat/home/bin:/usr/local/mysql/bin:/Users/toy/Library/Android/sdk/platform-tools
toydeMacBook-Pro:~ toy$

二、先科普一下

mac 一般使用bash作为默认shell

Mac系统的环境变量,加载顺序为:
/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
当然/etc/profile和/etc/paths是系统级别的,系统启动就会加载,后面几个是当前用户级的环境变量。后面3个按照从前往后的顺序读取,如果~/.bash_profile文件存在,则后面的几个文件就会被忽略不读了,如果~/.bash_profile文件不存在,才会以此类推读取后面的文件。~/.bashrc没有上述规则,它是bash shell打开的时候载入的。

如果没特殊说明,设置PATH的语法都为:
——————————————————-

# 中间用冒号隔开
 export PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>

三、(一)全局设置
下面的几个文件设置是全局的,修改时需要root权限

1)/etc/paths (全局建议修改这个文件 )
编辑 paths,将环境变量添加到 paths文件中 ,一行一个路径
Hint:输入环境变量时,不用一个一个地输入,只要拖动文件夹到 Terminal 里就可以了。

2)/etc/profile (建议不修改这个文件 )
全局(公有)配置,不管是哪个用户,登录时都会读取该文件。

3)/etc/bashrc (一般在这个文件中添加系统级环境变量)
全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件。

4)
1.创建一个文件:
sudo touch /etc/paths.d/mysql
2.用 vim 打开这个文件(如果是以 open -t 的方式打开,则不允许编辑):
sudo vim /etc/paths.d/mysql
3.编辑该文件,键入路径并保存(关闭该 Terminal 窗口并重新打开一个,就能使用 mysql 命令了)
/usr/local/mysql/bin
据说,这样可以自己生成新的文件,不用把变量全都放到 paths 一个文件里,方便管理。

(二)单个用户设置

1)~/.bash_profile (任意一个文件中添加用户级环境变量)
(注:Linux 里面是 .bashrc 而 Mac 是 .bash_profile)
若bash shell是以login方式执行时,才会读取此文件。该文件仅仅执行一次!默认情况下,他设置一些环境变量
设置命令别名alias ll=’ls -la’
设置环境变量:

1

export PATH=/opt/local/bin:/opt/local/sbin:$PATH

2)~/.bashrc 同上

四、如果想立刻生效,则可执行下面的语句:
$ source 相应的文件
一般环境变量更改后,重启后生效。

如果你重启后生效了那就不用往下看了。
按照如上修改了~/.bash_profile文件发现无效,并且提示 zsh: command not found: homestead 那么肯定是安装了zsh的缘故,因为安装zsh,~/.bash_profile就不会被执行,解决办法如下:

1.打开vim ~/.zshrc 将你要配置到环境变量配置到该文件中即可

2.打开vim ~/.zshrc 添加source ~/.bash_profile ,这样~/.bash_profile配置的环境变量同样有效

zsh环境变量失效问题
新版的zsh在登录的时候默认只会加载~/.zshrc的配置文件,以前配置的环境变量会无效,尝试网上的各种方法均无效
发现配置文件有这样一条说明

If you come from bash you might have to change your $PATH.

于是简单粗暴的解决方案:
编辑~/.zshrc文件
在开头添加一下配置

export PATH=$HOME/bin:/usr/local/bin:$PATH
source $HOME/.bashrc
source $HOME/.bash_profile

参考:https://www.jianshu.com/p/8ef18883c958

五、以maven 作为环境变量 来举例 配置

  1. 打开terminel输入以下命令:

    vim ~/.bash_profile 打开.bash_profile文件,在次文件中添加设置环境变量的命令
    export M2_HOME=/Users/xxx/Documents/maven/apache-maven-3.5.0
    export PATH=$PATH:$M2_HOME/bin
    添加之后保存并推出,执行以下命令使配置生效:
    source ~/.bash_profile

  2. 查看配置是否生效

    1、输入:mvn -v命令,输入如下:

    Apache Maven 3.5.0 (ff8f5e7444045639af65f6095c62210b5713f426; 2017-04-04T03:39:06+08:00)
    Maven home: /Users/xxx/Documents/maven/apache-maven-3.5.0
    Java version: 1.8.0_121, vendor: Oracle Corporation
    Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre
    Default locale: zh_CN, platform encoding: UTF-8
    OS name: "mac os x", version: "10.12.6", arch: "x86_64", family: "mac"

    则配置成功。

参考自:https://blog.csdn.net/hlllmr1314/article/details/52228672