ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Spring

2022-07-18 10:00:57  阅读:98  来源: 互联网

标签:Student Spring class println student test public


Spring

xml开发

导入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.13</version>
</dependency>

Spring配置文件

在resources包下

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

</beans>

配置上下文 点一下提示就好

Main方法

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfiguration.class);
        

    }
}

注册javabean,创建一个Student类

@Data  // 导入lombok依赖才能用
public class Student {
    int age;
    String name;
    
}

配置文件添加 bean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="Student" class="com.test.bean.Student"/>
// -> <bean id="Student" class="com.test.bean.Student"/>
</beans>

Main方法

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);

    }
}

bean 默认单例模式

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student = (Student) context.getBean("student");
        Student student2 = (Student) context.getBean("student");
        System.out.println(student);
        System.out.println(student2);
        System.out.println(student == student2);
    }
}

运行:

com.test.bean.Student@1ed4004b
com.test.bean.Student@1ed4004b
true

修改作用域

默认单例,修改为原型

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


<bean name="student" class="com.test.bean.Student" scope="prototype"/>

</beans>

运行:

com.test.bean.Student@72d818d1
com.test.bean.Student@6e06451e
false

原型模式每次创建一个新对象

定义初始化和销毁方法

bean 学生类

public class Student {
    int age;
    String name;

    public Student() {
        System.out.println("我是构造器");
    }

    public void init(){
        System.out.println("我是初始化方法");
    }
    public void destroy(){
        System.out.println("我是销毁方法");
    }
}

配置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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

<bean name="student" class="com.test.bean.Student" init-method="init" destroy-method="destroy"/>

</beans>

main方法

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);
        context.close();
    }
}

依赖注入

注入属性

需要有set方法,把实体类加上@Data,一了百了

配置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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean name="student" class="com.test.bean.Student">
        <property name="name" value="小明"/>
        <property name="age" value="22"/>
    </bean>

</beans>

main方法

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);

    }
}

注入对象类型

定义一个Card卡片类

public class Card { }

学生类

@Data
public class Student {
    int age;
    String name;
    Card card;

}

test.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

<bean class="com.test.bean.Card" name="card"/>
    <bean name="student" class="com.test.bean.Student">
        <property name="name" value="小明"/>
        <property name="age" value="22"/>
        <property name="card" ref="card"/>
    </bean>

</beans>

注入集合

List

Student.java

@Data
public class Student {
    int age;
    String name;
    List<String> list;

}

main方法

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);

    }
}

test.xml

<bean name="student" class="com.test.bean.Student">
    <property name="list">
        <list>
            <value>小明</value>
            <value>小红</value>
            <value>小刚</value>
        </list>
        // list 可以换成 map
    </property>
</bean>
map

Student.java

@Data
public class Student {
    int age;
    String name;
    Map<String , Integer> map;
     
}

main方法

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);

    }
}

test.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean name="student" class="com.test.bean.Student">
        <property name="map">
            <map>
                <entry key="小明" value="100"/>
                <entry key="小红" value="200"/>
                <entry key="小亮" value="103"/>
            </map>
        </property>
    </bean>

</beans>

自动装配

test.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean name="card" class="com.test.bean.Card"/>
    <bean name="student" class="com.test.bean.Student" autowire="byType"/>


</beans>

card.java

@Data
public class Card { }

student.java

@Data
public class Student {
    int age;
    String name;
    Card card;

}

main.java

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);

    }
}

构造器注入

test.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean name="card" class="com.test.bean.Card"/>
    <bean name="student" class="com.test.bean.Student" autowire="byType">
        <constructor-arg value="12" name="age"/>
<!--        <constructor-arg value="12" index="0"/>-->
    </bean>


</beans>

student.java

package com.test.bean;

import lombok.Data;

@Data
public class Student {
    int age;
    String name;
    Card card;

    public Student(int age) {
        this.age = age;
    }
}

main.java

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student = (Student) context.getBean("student");
        System.out.println(student);

    }
}

面向切面编程

导入依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.3.13</version>
</dependency>

注意点

  1. 需要切入的类,类的哪个方法需要被切入
  2. 切入之后需要执行什么动作
  3. 是在方法执行前切入还是在方法执行后切入
  4. 如何告诉Spring需要进行切入

可能有坑:

通配符的匹配很全面, 但无法找到元素 'aop:config' 的声明_灯下驼贼的博客-CSDN博客

test.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"
       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.xsd "
>


    <bean name="student" class="com.test.bean.Student"/>
    <bean name="aopTest" class="com.test.aop.AopTest"/>

    <aop:config>
        <aop:pointcut id="test" expression="execution(* com.test.bean.Student.test(..))"/>
        <aop:aspect ref="aopTest">
            <aop:before method="before" pointcut-ref="test"/>
            <aop:after-returning method="after" pointcut-ref="test"/>
        </aop:aspect>
    </aop:config>

</beans>

student.java

@Data
public class Student {
    int age;
    String name;
    Card card;

    public String test(String name){
        System.out.println("hello,world");
        return name;
    }

}

main.java

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student =  context.getBean(Student.class);
        student.test("h");

    }
}

aoptest.java

public class AopTest {
    //执行之后的方法
    public void after(){
        System.out.println("我是执行之后");
    }

    //执行之前的方法
    public void before(){
        System.out.println("我是执行之前");
    }
}

--->

public void after(JoinPoint point){
    System.out.println(point.getTarget());
    System.out.println(Arrays.toString(point.getArgs()));
    System.out.println("我是执行之后");
}

环绕方法

test.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"
       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.xsd "
>


    <bean name="student" class="com.test.bean.Student"/>
    <bean name="aopTest" class="com.test.aop.AopTest"/>

    <aop:config>
        <aop:pointcut id="test" expression="execution(* com.test.bean.Student.test(..))"/>
        <aop:aspect ref="aopTest">
            <aop:around method="around" pointcut-ref="test"/>
        </aop:aspect>
    </aop:config>

</beans>

aoptest.java

public class AopTest {

    public Object around(ProceedingJoinPoint joinPoint)throws Throwable{
        System.out.println("方法开始之前");
        Object value = joinPoint.proceed();
        System.out.println("方法完成" + value);
        return value;
    }

}

student.java

@Data
public class Student {
    int age;
    String name;
    Card card;

    public String test(String name){
        System.out.println("hello,world");
        return name;
    }

}

main.java

public class Main {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("test.xml");
        Student student =  context.getBean(Student.class);
        student.test("h");


    }
}

接口实现

aoptest.java

public class AopTest implements MethodBeforeAdvice, AfterReturningAdvice {

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("我是方法之前");
    }

    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
        System.out.println("我是方法之后");
    }
}

test.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"
       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.xsd "
>


    <bean name="student" class="com.test.bean.Student"/>
    <bean name="aopTest" class="com.test.aop.AopTest"/>

    <aop:config>
        <aop:pointcut id="stu" expression="execution(* com.test.bean.Student.test(String))"/>
        <aop:advisor advice-ref="aopTest" pointcut-ref="stu"/>
    </aop:config>

</beans>


注解开发

在配置文件中创建bean

mainconfiguration.java

@Configuration
public class MainConfiguration {
    @Bean
    @Scope("prototype")
    public Card card(){
        return new Card();
    }
}

main.java

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfiguration.class);
        Card card = context.getBean(Card.class);
        System.out.println(card);
    }
}

自动扫描包

mainconfiguration.java

@Configuration
@ComponentScan("com.test.bean")
public class MainConfiguration {

}

student.java

@Data
@Component
public class Student {
    int age;
    String name;
    Card card;

    public String test(String name){
        System.out.println("hello,world");
        return name;
    }

}

main.java

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfiguration.class);
        Student student = context.getBean(Student.class);
        System.out.println(student);
    }
}

添加对象类型

@Data
@Component
public class Student {
    int age;
    String name;
    @Resource
    Card card;

    public String test(String name){
        System.out.println("hello,world");
        return name;
    }

}

注解实现AOP

MainConfiguration.java

@EnableAspectJAutoProxy
@Configuration
@ComponentScan("com.test.bean")
public class MainConfiguration {

}

aoptest.java

@Component
@Aspect
public class AopTest  {

    @Before("execution(* com.test.bean.Student.test(..))")
    public void before(JoinPoint joinPoint) {
        System.out.println(Arrays.toString(joinPoint.getArgs()));
        System.out.println("我是方法之前");
    }

    @AfterReturning(value = "execution(* com.test.bean.Student.test(..))", returning = "returnVal")
    public void after(Object returnVal){
        System.out.println("方法已返回,结果为:"+returnVal);
    }

    @Around("execution(* com.test.bean.Student.test(..))")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("方法执行之前!");
        Object val = point.proceed();
        System.out.println("方法执行之后!");
        return val;
    }




}



另外@Import 可以引入其他类的配置

标签:Student,Spring,class,println,student,test,public
来源: https://www.cnblogs.com/instore/p/16489361.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有