Explorar o código

0111 spring注入与注解

Qing hai 1 ano
pai
achega
83538bf70d
Modificáronse 24 ficheiros con 575 adicións e 48 borrados
  1. 58 46
      spring-demo/pom.xml
  2. 36 0
      spring-demo/src/main/java/com/sf/annotation/Chair.java
  3. 44 0
      spring-demo/src/main/java/com/sf/annotation/House.java
  4. 16 0
      spring-demo/src/main/java/com/sf/annotation/Teacher.java
  5. 16 0
      spring-demo/src/main/java/com/sf/annotation/plane/Box.java
  6. 17 0
      spring-demo/src/main/java/com/sf/annotation/plane/Desk.java
  7. 6 0
      spring-demo/src/main/java/com/sf/annotation/plane/Plane.java
  8. 17 0
      spring-demo/src/main/java/com/sf/auto/Chair.java
  9. 19 0
      spring-demo/src/main/java/com/sf/auto/House.java
  10. 9 0
      spring-demo/src/main/java/com/sf/auto/Teacher.java
  11. 47 0
      spring-demo/src/main/java/com/sf/factory/Car.java
  12. 19 0
      spring-demo/src/main/java/com/sf/factory/CarInstanceFactory.java
  13. 21 0
      spring-demo/src/main/java/com/sf/factory/CarStaticFactory.java
  14. 10 0
      spring-demo/src/main/java/com/sf/factory/Test.java
  15. 7 0
      spring-demo/src/main/java/com/sf/self/BeanFactory.java
  16. 14 0
      spring-demo/src/main/resources/bean-annotation.xml
  17. 28 0
      spring-demo/src/main/resources/bean-auto.xml
  18. 57 0
      spring-demo/src/main/resources/bean-factory.xml
  19. 1 2
      spring-demo/src/main/resources/bean-lifecycle.xml
  20. 39 0
      spring-demo/src/test/java/com/sf/HelloJuint.java
  21. 17 0
      spring-demo/src/test/java/com/sf/TestAuto.java
  22. 26 0
      spring-demo/src/test/java/com/sf/TestFactory.java
  23. 2 0
      spring-demo/src/test/java/com/sf/TestPrototype.java
  24. 49 0
      spring-demo/src/test/java/com/sf/TestSpring.java

+ 58 - 46
spring-demo/pom.xml

@@ -1,50 +1,62 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <groupId>com.sf</groupId>
-  <artifactId>spring-demo</artifactId>
-  <version>1.0-SNAPSHOT</version>
-  <packaging>jar</packaging>
-
-  <name>spring-demo</name>
-  <url>http://maven.apache.org</url>
-
-  <properties>
-    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <kotlin.version>2.0.0-Beta2</kotlin.version>
-  </properties>
-
-  <dependencies>
-<!--    <dependency>-->
-<!--      <groupId>junit</groupId>-->
-<!--      <artifactId>junit</artifactId>-->
-<!--      <version>3.8.1</version>-->
-<!--      <scope>test</scope>-->
-<!--    </dependency>-->
-
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter-api</artifactId>
-      <version>5.10.1</version>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.springframework</groupId>
-      <artifactId>spring-context</artifactId>
-      <version>6.1.2</version>
-    </dependency>
-
-    <!-- maven search -->
-<!--    <dependency>-->
-<!--      <groupId>org.springframework</groupId>-->
-<!--      <artifactId>spring-context</artifactId>-->
-<!--      <version>6.1.1</version>-->
-<!--    </dependency>-->
-
-
-  </dependencies>
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.sf</groupId>
+    <artifactId>spring-demo</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>spring-demo</name>
+    <url>http://maven.apache.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <kotlin.version>2.0.0-Beta2</kotlin.version>
+    </properties>
+
+    <dependencies>
+        <!--    <dependency>-->
+        <!--      <groupId>junit</groupId>-->
+        <!--      <artifactId>junit</artifactId>-->
+        <!--      <version>3.8.1</version>-->
+        <!--      <scope>test</scope>-->
+        <!--    </dependency>-->
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>5.10.1</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>6.1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <version>6.1.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.annotation</groupId>
+            <artifactId>jakarta.annotation-api</artifactId>
+            <version>3.0.0-M1</version>
+        </dependency>
+
+        <!-- maven search -->
+        <!--    <dependency>-->
+        <!--      <groupId>org.springframework</groupId>-->
+        <!--      <artifactId>spring-context</artifactId>-->
+        <!--      <version>6.1.1</version>-->
+        <!--    </dependency>-->
+
+
+    </dependencies>
 
 
 </project>

+ 36 - 0
spring-demo/src/main/java/com/sf/annotation/Chair.java

@@ -0,0 +1,36 @@
+package com.sf.annotation;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Chair {
+
+//    @Autowired
+    private Teacher teacher;
+
+//    @Autowired
+//    public void setTeacher(Teacher teacher) {
+//        this.teacher = teacher;
+//    }
+
+    @Autowired
+    public Chair(Teacher teacher) {
+        this.teacher = teacher;
+    }
+
+    public Chair() {
+        System.out.println("Chair");
+    }
+
+    public Teacher getTeacher() {
+        return teacher;
+    }
+
+    @Override
+    public String toString() {
+        return "Chair{" +
+                "teacher=" + teacher +
+                '}';
+    }
+}

+ 44 - 0
spring-demo/src/main/java/com/sf/annotation/House.java

@@ -0,0 +1,44 @@
+package com.sf.annotation;
+
+import com.sf.annotation.plane.Plane;
+import jakarta.annotation.Resource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+@Component
+public class House {
+
+    // 默认按照类型来匹配bean的   byType
+    // 如果需要按照名字来匹配 结合@Qualifier使用  byName
+    @Autowired
+    private Chair chair;
+
+    // 使用 @Autowired 如果对应类型的bean有多个 按照类型查找不到  会变成按照名字查找
+    // Plane plane; 按照“plane” 查找 如果查找不到 会报错
+    // Could not autowire. There is more than one bean of 'Plane' type.
+    //   一种方案是 给出一个具体的能够找到的bean名字  Plane box;  Plane desk;
+    //   另一种方案是  使用@Qualifier  将要找的bean名字传入到注解中  此时传入的是beanId
+//    @Autowired
+//    @Qualifier("desk")
+//    private Plane plane;
+    @Resource
+    private Plane desk;
+
+    public Chair getChair() {
+        return chair;
+    }
+
+
+    public House() {
+        System.out.println("House");
+    }
+
+    @Override
+    public String toString() {
+        return "House{" +
+                "chair=" + chair +
+                ", desk=" + desk +
+                '}';
+    }
+}

+ 16 - 0
spring-demo/src/main/java/com/sf/annotation/Teacher.java

@@ -0,0 +1,16 @@
+package com.sf.annotation;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class Teacher {
+
+    public Teacher() {
+        System.out.println("Teacher");
+    }
+
+    @Override
+    public String toString() {
+        return "Teacher{}";
+    }
+}

+ 16 - 0
spring-demo/src/main/java/com/sf/annotation/plane/Box.java

@@ -0,0 +1,16 @@
+package com.sf.annotation.plane;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class Box implements Plane {
+    @Override
+    public void put() {
+        System.out.println("this is box");
+    }
+
+    @Override
+    public String toString() {
+        return "Box{}";
+    }
+}

+ 17 - 0
spring-demo/src/main/java/com/sf/annotation/plane/Desk.java

@@ -0,0 +1,17 @@
+package com.sf.annotation.plane;
+
+import com.sf.annotation.plane.Plane;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Desk implements Plane {
+    @Override
+    public void put() {
+        System.out.println("this is desk");
+    }
+
+    @Override
+    public String toString() {
+        return "Desk{}";
+    }
+}

+ 6 - 0
spring-demo/src/main/java/com/sf/annotation/plane/Plane.java

@@ -0,0 +1,6 @@
+package com.sf.annotation.plane;
+
+public interface Plane {
+    // 平面
+    void put();
+}

+ 17 - 0
spring-demo/src/main/java/com/sf/auto/Chair.java

@@ -0,0 +1,17 @@
+package com.sf.auto;
+
+public class Chair {
+    // 椅子
+    private Teacher teacher;
+
+    public void setTeacher(Teacher teacher) {
+        this.teacher = teacher;
+    }
+
+    @Override
+    public String toString() {
+        return "Chair{" +
+                "teacher=" + teacher +
+                '}';
+    }
+}

+ 19 - 0
spring-demo/src/main/java/com/sf/auto/House.java

@@ -0,0 +1,19 @@
+package com.sf.auto;
+
+public class House {
+
+    // 屋子中有椅子  椅子上坐着一位老师
+    private Chair chair;
+
+    public void setChair(Chair chair) {
+        System.out.println("House setChair");
+        this.chair = chair;
+    }
+
+    @Override
+    public String toString() {
+        return "House{" +
+                "chair=" + chair +
+                '}';
+    }
+}

+ 9 - 0
spring-demo/src/main/java/com/sf/auto/Teacher.java

@@ -0,0 +1,9 @@
+package com.sf.auto;
+
+public class Teacher {
+
+    @Override
+    public String toString() {
+        return "Teacher{}";
+    }
+}

+ 47 - 0
spring-demo/src/main/java/com/sf/factory/Car.java

@@ -0,0 +1,47 @@
+package com.sf.factory;
+
+public class Car {
+    private int id;
+    private String name;
+    private int price;
+
+    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 int getPrice() {
+        return price;
+    }
+
+    public void setPrice(int price) {
+        this.price = price;
+    }
+
+    @Override
+    public String toString() {
+        return "Car [id=" + id + ", name=" + name + ", price=" + price + "]";
+    }
+
+    public Car(){
+
+    }
+
+    public Car(int id, String name, int price) {
+        super();
+        this.id = id;
+        this.name = name;
+        this.price = price;
+    }
+}

+ 19 - 0
spring-demo/src/main/java/com/sf/factory/CarInstanceFactory.java

@@ -0,0 +1,19 @@
+package com.sf.factory;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CarInstanceFactory {
+    private Map<Integer, Car> map = new HashMap<Integer,Car>();
+
+    public void setMap(Map<Integer, Car> map) {
+        this.map = map;
+    }
+
+    public CarInstanceFactory(){
+    }
+
+    public Car getCar(int id){
+        return map.get(id);
+    }
+}

+ 21 - 0
spring-demo/src/main/java/com/sf/factory/CarStaticFactory.java

@@ -0,0 +1,21 @@
+package com.sf.factory;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class CarStaticFactory {
+    private static Map<Integer, Car> map = new HashMap<Integer, Car>();
+
+    // 先生产出来 而且每个id只有唯一一个  是一种饿汉式的单例
+    static {
+        Car car1 = new Car(1, "Honda", 300000);
+        map.put(1, car1);
+        map.put(2, new Car(2, "Audi", 440000));
+        map.put(3, new Car(3, "BMW", 540000));
+    }
+
+    public static Car getCar(int id) {
+        return map.get(id);
+    }
+}

+ 10 - 0
spring-demo/src/main/java/com/sf/factory/Test.java

@@ -0,0 +1,10 @@
+package com.sf.factory;
+
+public class Test {
+
+    public static void main(String[] args) {
+        // 获取对象时  不再通过自身 而是通过工厂  叫做工厂模式
+        Car car = CarStaticFactory.getCar(1);
+        System.out.println(car);
+    }
+}

+ 7 - 0
spring-demo/src/main/java/com/sf/self/BeanFactory.java

@@ -1,6 +1,10 @@
 package com.sf.self;
 
+import com.sf.factory.Car;
+
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 // 生产bean的工厂
 //   先要获取对bean的配置   id class
@@ -9,6 +13,9 @@ public class BeanFactory {
     // user  com.sf.User
     // user1  com.sf.User
     private List<BeanDefined> beanDefinedList;
+    private Map<String, BeanFactory> beanMap = new HashMap<>();
+    // <beanId, Bean对象>
+    // getBean(String beanId)  ->  从map中遍历 这是单例的话 是直接从map中取出的
 
     public BeanFactory(List<BeanDefined> beanDefinedList) {
         this.beanDefinedList = beanDefinedList;

+ 14 - 0
spring-demo/src/main/resources/bean-annotation.xml

@@ -0,0 +1,14 @@
+<?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
+        https://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/context
+        https://www.springframework.org/schema/context/spring-context.xsd">
+
+    <!-- 扫描要创建的对象 (组件component scann是扫描) 要配置一个包的路径 base-package
+       去扫描注解 组件@Component-->
+    <context:component-scan base-package="com.sf.annotation">
+    </context:component-scan>
+</beans>

+ 28 - 0
spring-demo/src/main/resources/bean-auto.xml

@@ -0,0 +1,28 @@
+<?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 id="house" class="com.sf.auto.House">-->
+<!--        <property name="chair" ref="chair"></property>-->
+<!--    </bean>-->
+    <!-- byType 代表House 需要一个 Chair chair  通过Chair的类型 去找bean的class有没有符合的 -->
+<!--    <bean id="house" class="com.sf.auto.House" autowire="byType"></bean>-->
+
+    <!-- byName 代表Chair chair 不管类型 看属性名字 通过"chair"的字符串 去找bean的id有没有符合的
+    如果找不到 会赋值失败 或者说注入失败 -->
+    <bean id="house" class="com.sf.auto.House" autowire="byName"></bean>
+<!--    <bean id="chair" class="com.sf.auto.Chair">-->
+<!--        <property name="teacher" ref="teacher"></property>-->
+<!--    </bean>-->
+    <!-- Teacher teacher;
+    在通过类型匹配bean时 如果同一类型配置了多个对象 会报错
+    Could not autowire. There is more than one bean of 'Teacher' type.
+    Beans: teacher1,teacher. Properties: 'teacher'
+    但如果没找到对应类型 不会报错 会为空-->
+    <bean id="chair" class="com.sf.auto.Chair" autowire="byType"></bean>
+<!--    <bean id="chair1" class="com.sf.auto.Chair" autowire="byType"></bean>-->
+    <bean id="teacher" class="com.sf.auto.Teacher"></bean>
+<!--    <bean id="teacher1" class="com.sf.auto.Teacher"></bean>-->
+</beans>

+ 57 - 0
spring-demo/src/main/resources/bean-factory.xml

@@ -0,0 +1,57 @@
+<?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 id="bmwCar" class="com.sf.factory.CarStaticFactory"
+          factory-method="getCar"> <constructor-arg value="3"></constructor-arg>
+    </bean>
+
+
+    <!--
+        private static Map<Integer, Car> map = new HashMap<Integer, Car>();
+
+        // 先生产出来 而且每个id只有唯一一个  是一种饿汉式的单例
+        static {
+            Car car1 = new Car(1, "Honda", 300000);
+            map.put(1, car1);
+            map.put(2, new Car(2, "Audi", 440000));
+            map.put(3, new Car(3, "BMW", 540000));
+        }
+    -->
+    <bean id="carFactory" class="com.sf.factory.CarInstanceFactory">
+        <property name="map">
+            <map>
+                <entry key="4">
+<!--                    <key><value>4</value></key>-->
+                    <!-- 如果一个对象创建完 不需要被别的地方调用 可以没有名字 -->
+                    <!-- 如果一个bean创建完 不需要被别的地方调用 可以没有id -->
+                    <bean class="com.sf.factory.Car">
+                        <property name="id" value="4"></property>
+                        <property name="name" value="Honda"></property>
+                        <property name="price" value="300000"></property>
+                    </bean>
+                </entry>
+
+                <entry key="6">
+                    <bean class="com.sf.factory.Car">
+                        <property name="id" value="6"></property>
+                        <property name="name" value="ford"></property>
+                        <property name="price" value="500000"></property>
+                    </bean>
+                </entry>
+            </map>
+        </property>
+    </bean>
+
+    <!-- 2.use Factory bean to get bean objectr
+       factory-bean : the bean define above
+       factory-method: method of get Bean Object
+       constructor-arg: parameters of factory-method
+    -->
+    <bean id="car4" factory-bean="carFactory" factory-method="getCar">
+        <constructor-arg value="4"></constructor-arg>
+    </bean>
+
+</beans>

+ 1 - 2
spring-demo/src/main/resources/bean-lifecycle.xml

@@ -4,8 +4,7 @@
        xsi:schemaLocation="http://www.springframework.org/schema/beans
         https://www.springframework.org/schema/beans/spring-beans.xsd">
 
-    <bean id="auth" class="com.sf.Auth" scope="singleton"
-          init-method="init" destroy-method="destroy">
+    <bean id="auth" class="com.sf.Auth" init-method="init" destroy-method="destroy">
         <property name="name" value="CRUD"></property>
     </bean>
     <bean id="myBeanPost" class="com.sf.lifecycle.MyBeanPost"></bean>

+ 39 - 0
spring-demo/src/test/java/com/sf/HelloJuint.java

@@ -0,0 +1,39 @@
+package com.sf;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+/**
+ * 使用JUnit5进行测试类
+ *
+ * @author pan_junbiao
+ **/
+public class HelloJuint {
+
+    private ApplicationContext context;
+
+    @BeforeEach
+    public void setUp() {
+        context = new ClassPathXmlApplicationContext("bean.xml");
+    }
+
+    @AfterEach
+    public void tearDown() {
+        System.out.println("@AfterEach,测试结束");
+    }
+
+    // ctrl + alt + L 格式化的快捷键
+    @Test
+    public void sayHello() {
+        System.out.println("hello junit");
+    }
+
+    @Test
+    public void sayHello1() {
+        System.out.println("hello11 junit");
+    }
+}
+

+ 17 - 0
spring-demo/src/test/java/com/sf/TestAuto.java

@@ -0,0 +1,17 @@
+package com.sf;
+
+import com.sf.auto.House;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class TestAuto {
+
+    @Test
+    public void test() {
+        ApplicationContext context =
+                new ClassPathXmlApplicationContext("bean-auto.xml");
+        House house = context.getBean("house", House.class);
+        System.out.println(house);
+    }
+}

+ 26 - 0
spring-demo/src/test/java/com/sf/TestFactory.java

@@ -0,0 +1,26 @@
+package com.sf;
+
+import com.sf.factory.Car;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class TestFactory {
+
+    @Test
+    public void testStatic() {
+        ApplicationContext context =
+                new ClassPathXmlApplicationContext("bean-factory.xml");
+        Car bmwCar = (Car) context.getBean("bmwCar");
+        System.out.println(bmwCar);
+    }
+
+    @Test
+    public void testInstance() {
+        ApplicationContext context =
+                new ClassPathXmlApplicationContext("bean-factory.xml");
+        Car car4 = (Car) context.getBean("car4");
+        System.out.println(car4);
+    }
+
+}

+ 2 - 0
spring-demo/src/test/java/com/sf/TestPrototype.java

@@ -23,5 +23,7 @@ public class TestPrototype {
         ApplicationContext context = new ClassPathXmlApplicationContext("bean-lifecycle.xml");
         Auth auth = context.getBean("auth", Auth.class);
         System.out.println(auth);
+        ((ClassPathXmlApplicationContext) context).close();
+
     }
 }

+ 49 - 0
spring-demo/src/test/java/com/sf/TestSpring.java

@@ -0,0 +1,49 @@
+package com.sf;
+
+import com.sf.annotation.Chair;
+import com.sf.annotation.House;
+import com.sf.annotation.Teacher;
+import com.sf.annotation.plane.Plane;
+import jakarta.annotation.Resource;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
+
+// 根据配置的地址 找到spring容器要加载的xml文件
+@SpringJUnitConfig(locations = "classpath:bean-annotation.xml")
+public class TestSpring {
+
+    // 从容器中取出House类型的对象
+    @Autowired
+    private House house;
+
+    @Autowired
+    private ApplicationContext context;
+
+
+    @Test
+    public void test() {
+        System.out.println(house);
+//        house.getBox().put();
+    }
+
+    @Test
+    public void testContext() {
+        //    @Autowired
+        //    @Qualifier("desk")
+        //    private Plane plane;
+//        Plane plane = context.getBean(Plane.class); // 不可行
+//        Plane plane1 = (Plane)context.getBean("plane");
+        Plane plane3 = (Plane) context.getBean("box");
+        Plane plane4 = (Plane) context.getBean("desk");
+        System.out.println(plane3);
+        System.out.println(plane4);
+
+//        @Resource
+//        private Plane desk;
+        Plane plane5 =  (Plane) context.getBean("desk");
+        System.out.println(plane5);
+    }
+
+}