Spring博客

1.spring简单使用

1.1 先导入包

uploading.4e448015.gif正在上传…重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

 

 

 

1.2 写个pojo(简单的java对象),Category类

 

public class Category {

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    private int id;
    private String name;
}

 

 

1.3 在src目录下写applicationContext.xml配置文件

applicationContext.xml是Spring的核心配置文件,通过关键字c即可获取Category对象,该对象获取的时候,即被注入了字符串"category 1“到name属性中

 

 

1.4 写TestSpring

 

public class TestSpring {

    public static void main(String[] args) {
        //似乎是拿来加载配置文件的
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml" });

        //获取对象
        Category c = (Category) context.getBean("c");

        System.out.println(c.getName());
    }
}

 

1.5原理

 

 

以获取对象的方式来进行比较

传统的方式:
通过new 关键字主动创建一个对象
IOC方式
对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 IOC是反转控制 (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。

打个比喻:
传统方式:相当于你自己去菜市场new 了一只鸡,不过是生鸡,要自己拔毛,去内脏,再上花椒,酱油,烤制,经过各种工序之后,才可以食用。
用 IOC:相当于去馆子(Spring)点了一只鸡,交到你手上的时候,已经五味俱全,你就只管吃就行了。

uploading.4e448015.gif转存失败重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

 

 

 

 

2.注入对象

2.1 先写个实体类

public class Product {

    private int id;
    private String name;
    private Category category;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }
}

 

 

2.2 修改配置文件

 

<bean name="p" class="spring.Product">
    <property name="name" value="product1" />
    <property name="category" ref="c" />
</bean>

 

 

 

2.3 修改Test

public class TestSpring {

    public static void main(String[] args) {
        //似乎是拿来加载配置文件的
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml" });

        //获取对象
        Category c = (Category) context.getBean("c");
        Product p = (Product) context.getBean("p");


        System.out.println(c.getName());
        System.out.println(p.getCategory().getName());
    }
}

 

3.注解方式IOC/DI

(IOC 反转控制 是Spring的基础,Inversion Of Control

DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可)

3.1 在上一轮代码中做修改,先修改配置文件

<!--表示告诉Spring要用注解的方式进行配置
    base-package的意思是spring会自动扫描xxx路径下单注解-->
<context:component-scan base-package="spring"/>
<!--设置对象的名字为c class则是位置-->
<bean name="c" class="spring.Category">
    <!--设置对象的属性值-->
    <property name="name" value="category 1" />
</bean>

<bean name="p" class="spring.Product">
    <property name="name" value="product1" />
    <!--<property name="category" ref="c" />-->
</bean>

 

3.2 Product类的字段前加注解(在setCategory前面加也可以)

 

public class Product {

    private int id;
    private String name;
    //这里@Autowired注解的意思就是,当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去
    @Autowired
    private Category category;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }
}

 

 

3.3 运行

uploading.4e448015.gif转存失败重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

3.4@Resource

1、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

2、指定了name或者type则根据指定的类型去匹配bean

3、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

然后,区分一下@Autowired和@Resource两个注解的区别:

1、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

2、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

 

3.5 @Component("p")

@Component("p")可以表明此类是bean,在类前加就好,这样配置文件里就不用写bean了

 

 

4.AOP

AOP 即 Aspect Oriented Program 面向切面编程

首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等

周边功能在Spring的面向切面编程AOP思想里,即被定义为切面

在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP

 

4.1 导入jar包

为了支持AOP,需要用到一些额外的JAR包。 这些额外的JAR包放在右上角的可运行项目,解压出来的lib目录下。

 

4.2 思路图

1. 功能分两大类,辅助功能和核心业务功能
2. 辅助功能和核心业务功能彼此独立进行开发
3. 比如登陆功能,即便是没有性能统计和日志输出,也可以正常运行
4. 如果有需要,就把"日志输出" 功能和 "登陆" 功能 编织在一起,这样登陆的时候,就可以看到日志输出了
5. 辅助功能,又叫做切面,这种能够选择性的,低耦合的把切面和核心业务功能结合在一起的编程思想,就叫做切面编程

uploading.4e448015.gif转存失败重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

 

4.3 准备业务类 ProductService

public class ProductService {

    public void doSomeService(){

        System.out.println("doSomeService");

    }

}

 

 

 

 

4.4 写日志切面LoggerAspect

 

public class LoggerAspect {

    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("start log:" + joinPoint.getSignature().getName());
        //JoinPoint对象封装了SpringAop中切面方法的信息
        //ProceedingJoinPoint 执行proceed方法的作用是让目标方法执行
        Object object = joinPoint.proceed();
        System.out.println("end log:" + joinPoint.getSignature().getName());
        return object;
    }
}

 

 

4.5 写applicationContext.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:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--表示告诉Spring要用注解的方式进行配置
        base-package的意思是spring会自动扫描xxx路径下单注解-->
    <context:component-scan base-package="spring"/>
    <!--设置对象的名字为c class则是位置-->
    <bean name="c" class="spring.Category">
        <!--设置对象的属性值-->
        <property name="name" value="category 1" />
    </bean>

    <bean name="p" class="spring.Product">
        <property name="name" value="product1" />
        <!--<property name="category" ref="c" />-->
    </bean>

    <!--声明业务对象-->
    <bean name="s" class="spring.ProductService">
    </bean>

    <!--声明日志切面-->
    <bean id="loggerAspect" class="spring.LoggerAspect"/>

    <!--指定右边的核心业务功能-->
    <aop:config>
        <!-- execution:用于匹配方法执行的连接点-->
        <!--execution(public * *(..))  任意公共方法的执行;
            execution(* set*(..))  任何一个以“set”开始的方法的执行;
            execution(* com.xyz.service.AccountService.*(..)) AccountService接口的任意方法的执行;
            execution(* com.xyz.service.*.*(..))  定义在service包里的任意方法的执行;
            execution(* com.xyz.service..*.*(..))  定义在service包或者子包里的任意方法的执行;-->
        <aop:pointcut id="loggerCutpoint"
                      expression=
                              "execution(* spring.ProductService.*(..)) "/>

        <!--指定左边的辅助功能
            然后通过aop:config把业务对象与辅助功能编织在一起。-->
        <!--ref里是写上面定义的切面id-->
        <!--method里面写的是方法名
            pointcut-ref里面则调用上面写的语句-->
        <aop:aspect id="logAspect" ref="loggerAspect">
            <aop:around pointcut-ref="loggerCutpoint" method="log"/>
        </aop:aspect>
    </aop:config>

</beans>

 

4.6 运行

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] { "applicationContext.xml" });
    ProductService s = (ProductService) context.getBean("s");
    s.doSomeService();
}

 

 

参考网站:

1.spring简单使用

1.1 先导入包

uploading.4e448015.gif正在上传…重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

 

 

 

1.2 写个pojo(简单的java对象),Category类

 

public class Category {

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    private int id;
    private String name;
}

 

 

1.3 在src目录下写applicationContext.xml配置文件

applicationContext.xml是Spring的核心配置文件,通过关键字c即可获取Category对象,该对象获取的时候,即被注入了字符串"category 1“到name属性中

 

 

1.4 写TestSpring

 

public class TestSpring {

    public static void main(String[] args) {
        //似乎是拿来加载配置文件的
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml" });

        //获取对象
        Category c = (Category) context.getBean("c");

        System.out.println(c.getName());
    }
}

 

1.5原理

 

 

以获取对象的方式来进行比较

传统的方式:
通过new 关键字主动创建一个对象
IOC方式
对象的生命周期由Spring来管理,直接从Spring那里去获取一个对象。 IOC是反转控制 (Inversion Of Control)的缩写,就像控制权从本来在自己手里,交给了Spring。

打个比喻:
传统方式:相当于你自己去菜市场new 了一只鸡,不过是生鸡,要自己拔毛,去内脏,再上花椒,酱油,烤制,经过各种工序之后,才可以食用。
用 IOC:相当于去馆子(Spring)点了一只鸡,交到你手上的时候,已经五味俱全,你就只管吃就行了。

uploading.4e448015.gif正在上传…重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

 

 

 

 

2.注入对象

2.1 先写个实体类

public class Product {

    private int id;
    private String name;
    private Category category;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }
}

 

 

2.2 修改配置文件

 

<bean name="p" class="spring.Product">
    <property name="name" value="product1" />
    <property name="category" ref="c" />
</bean>

 

 

 

2.3 修改Test

public class TestSpring {

    public static void main(String[] args) {
        //似乎是拿来加载配置文件的
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml" });

        //获取对象
        Category c = (Category) context.getBean("c");
        Product p = (Product) context.getBean("p");


        System.out.println(c.getName());
        System.out.println(p.getCategory().getName());
    }
}

 

3.注解方式IOC/DI

(IOC 反转控制 是Spring的基础,Inversion Of Control

DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可)

3.1 在上一轮代码中做修改,先修改配置文件

<!--表示告诉Spring要用注解的方式进行配置
    base-package的意思是spring会自动扫描xxx路径下单注解-->
<context:component-scan base-package="spring"/>
<!--设置对象的名字为c class则是位置-->
<bean name="c" class="spring.Category">
    <!--设置对象的属性值-->
    <property name="name" value="category 1" />
</bean>

<bean name="p" class="spring.Product">
    <property name="name" value="product1" />
    <!--<property name="category" ref="c" />-->
</bean>

 

3.2 Product类的字段前加注解(在setCategory前面加也可以)

 

public class Product {

    private int id;
    private String name;
    //这里@Autowired注解的意思就是,当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去
    @Autowired
    private Category category;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Category getCategory() {
        return category;
    }
    public void setCategory(Category category) {
        this.category = category;
    }
}

 

 

3.3 运行

uploading.4e448015.gif正在上传…重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

3.4@Resource

1、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

2、指定了name或者type则根据指定的类型去匹配bean

3、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

然后,区分一下@Autowired和@Resource两个注解的区别:

1、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

2、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

 

3.5 @Component("p")

@Component("p")可以表明此类是bean,在类前加就好,这样配置文件里就不用写bean了

 

 

4.AOP

AOP 即 Aspect Oriented Program 面向切面编程

首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等

周边功能在Spring的面向切面编程AOP思想里,即被定义为切面

在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP

 

4.1 导入jar包

为了支持AOP,需要用到一些额外的JAR包。 这些额外的JAR包放在右上角的可运行项目,解压出来的lib目录下。

 

4.2 思路图

1. 功能分两大类,辅助功能和核心业务功能
2. 辅助功能和核心业务功能彼此独立进行开发
3. 比如登陆功能,即便是没有性能统计和日志输出,也可以正常运行
4. 如果有需要,就把"日志输出" 功能和 "登陆" 功能 编织在一起,这样登陆的时候,就可以看到日志输出了
5. 辅助功能,又叫做切面,这种能够选择性的,低耦合的把切面和核心业务功能结合在一起的编程思想,就叫做切面编程

uploading.4e448015.gif正在上传…重新上传取消uploading.4e448015.gif转存失败重新上传取消

 

 

4.3 准备业务类 ProductService

public class ProductService {

    public void doSomeService(){

        System.out.println("doSomeService");

    }

}

 

 

 

 

4.4 写日志切面LoggerAspect

 

public class LoggerAspect {

    public Object log(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("start log:" + joinPoint.getSignature().getName());
        //JoinPoint对象封装了SpringAop中切面方法的信息
        //ProceedingJoinPoint 执行proceed方法的作用是让目标方法执行
        Object object = joinPoint.proceed();
        System.out.println("end log:" + joinPoint.getSignature().getName());
        return object;
    }
}

 

 

4.5 写applicationContext.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:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!--表示告诉Spring要用注解的方式进行配置
        base-package的意思是spring会自动扫描xxx路径下单注解-->
    <context:component-scan base-package="spring"/>
    <!--设置对象的名字为c class则是位置-->
    <bean name="c" class="spring.Category">
        <!--设置对象的属性值-->
        <property name="name" value="category 1" />
    </bean>

    <bean name="p" class="spring.Product">
        <property name="name" value="product1" />
        <!--<property name="category" ref="c" />-->
    </bean>

    <!--声明业务对象-->
    <bean name="s" class="spring.ProductService">
    </bean>

    <!--声明日志切面-->
    <bean id="loggerAspect" class="spring.LoggerAspect"/>

    <!--指定右边的核心业务功能-->
    <aop:config>
        <!-- execution:用于匹配方法执行的连接点-->
        <!--execution(public * *(..))  任意公共方法的执行;
            execution(* set*(..))  任何一个以“set”开始的方法的执行;
            execution(* com.xyz.service.AccountService.*(..)) AccountService接口的任意方法的执行;
            execution(* com.xyz.service.*.*(..))  定义在service包里的任意方法的执行;
            execution(* com.xyz.service..*.*(..))  定义在service包或者子包里的任意方法的执行;-->
        <aop:pointcut id="loggerCutpoint"
                      expression=
                              "execution(* spring.ProductService.*(..)) "/>

        <!--指定左边的辅助功能
            然后通过aop:config把业务对象与辅助功能编织在一起。-->
        <!--ref里是写上面定义的切面id-->
        <!--method里面写的是方法名
            pointcut-ref里面则调用上面写的语句-->
        <aop:aspect id="logAspect" ref="loggerAspect">
            <aop:around pointcut-ref="loggerCutpoint" method="log"/>
        </aop:aspect>
    </aop:config>

</beans>

 

4.6 运行

public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] { "applicationContext.xml" });
    ProductService s = (ProductService) context.getBean("s");
    s.doSomeService();
}

 

参考网站:https://how2j.cn/k/spring/spring-ioc-di/87.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值