网站建设及推广好做吗,瓯海网站建设,手机端h5网站模板下载,济南协会网站设计团队文章目录 1.基本使用1.基本介绍2.快速入门1.引入jar包2.MyComponent.java3.UserAction.java3.UserDao.java4.UserService.java5.beans05.xml6.断点查看bean对象是否创建7.测试 3.注意事项和细节 2.自己实现spring注解1.需求分析2.思路分析图3.编写自定义注解ComponentScan4.编写… 文章目录 1.基本使用1.基本介绍2.快速入门1.引入jar包2.MyComponent.java3.UserAction.java3.UserDao.java4.UserService.java5.beans05.xml6.断点查看bean对象是否创建7.测试 3.注意事项和细节 2.自己实现spring注解1.需求分析2.思路分析图3.编写自定义注解ComponentScan4.编写配置类SunSpringConfig5.编写容器SunSpringApplicationContext6.测试 3.自动装配1.AutoWired方式1.基本说明2.UserDao.java3.UserService.java4.测试 2.Resource方式推荐1.基本说明2.UserDao.java3.UserService.java 4.泛型依赖注入1.基本说明1.基本介绍2.参考关系图 1.基本使用
1.基本介绍 2.快速入门
1.引入jar包 2.MyComponent.java
package com.sxs.spring.component;import org.springframework.stereotype.Component;/*** Component 标识该类是一个组件当不确定该类的层级的时候就使用这个注解* author 孙显圣* version 1.0*/Component
public class MyComponent {
}
3.UserAction.java
package com.sxs.spring.component;import org.springframework.stereotype.Controller;/*** Controller 用于标识该类是一个控制器相当于servlet* author 孙显圣* version 1.0*/
Controller
public class UserAction {
}
3.UserDao.java
package com.sxs.spring.component;import org.springframework.stereotype.Repository;/*** Repository 用来标识该类是一个dao* author 孙显圣* version 1.0*/
Repository
public class UserDao {
}
4.UserService.java
package com.sxs.spring.component;import org.springframework.stereotype.Service;/*** Service 用于标识该类是一个Service* author 孙显圣* version 1.0*/
Service
public class UserService {
}
5.beans05.xml
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd!--component-scan 表示对指定包下的类进行扫描并创建对象到容器base-package 指定要扫描的包--context:component-scan base-packagecom.sxs.spring.component/context:component-scan
/beans6.断点查看bean对象是否创建 7.测试 //通过注解来配置beanTestpublic void setBeanByAnnotation() {//从类路径下读取配置文件ApplicationContext ioc new ClassPathXmlApplicationContext(beans05.xml);//分别获取这四个对象由于是单例的所以可以直接通过类型获取MyComponent component ioc.getBean(MyComponent.class);UserAction action ioc.getBean(UserAction.class);UserDao userDao ioc.getBean(UserDao.class);UserService userService ioc.getBean(UserService.class);System.out.println( component action userDao userService);}3.注意事项和细节 2.自己实现spring注解
1.需求分析 2.思路分析图 3.编写自定义注解ComponentScan
package com.sxs.spring.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 自定义注解用于指定要扫描的包** author 孙显圣* version 1.0*/
Target(ElementType.TYPE) //指定目前的注解可以修饰TYPE程序元素
Retention(RetentionPolicy.RUNTIME) //指定注解的保留范围在运行时可以生效
public interface ComponentScan {String value() default ; //指定注解可以传入一个String类型的值用于指定要扫描的包
}
4.编写配置类SunSpringConfig
package com.sxs.spring.annotation;/*** author 孙显圣* version 1.0*/
ComponentScan(value com.sxs.spring.component) //自定义注解指定要扫描的包
public class SunSpringConfig {}
5.编写容器SunSpringApplicationContext
package com.sxs.spring.annotation;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import java.io.File;
import java.net.URL;
import java.util.concurrent.ConcurrentHashMap;/*** 类似于Spring原生的ioc容器** author 孙显圣* version 1.0*/
public class SunSpringApplicationContext {//传进来一个配置类的Class对象private Class configClass;//存放对象的容器private final ConcurrentHashMapString, Object ioc new ConcurrentHashMap();//构造器接收配置类的class对象public SunSpringApplicationContext(Class configClass) throws ClassNotFoundException, InstantiationException, IllegalAccessException {this.configClass configClass;//获取要扫描的包//1.首先反射获取类的注解信息ComponentScan componentScan (ComponentScan) this.configClass.getDeclaredAnnotation(ComponentScan.class);//2.通过注解来获取要扫描的包的路径String path componentScan.value();//得到要扫描包的.class文件//1.获取类加载器ClassLoader classLoader SunSpringApplicationContext.class.getClassLoader();//2.获取要扫描包的真实路径默认刚开始在根目录下path path.replace(., /);URL resource classLoader.getResource(path);//3.由该路径创建一个文件对象可使用resource.getFile()将URL类型转化为String类型File file new File(resource.getFile());//4.遍历该文件夹下的所有.class文件if (file.isDirectory()) {File[] files file.listFiles();for (File f : files ) {//反射注入容器//1.获取所有文件的全路径String absolutePath f.getAbsolutePath();//只处理class文件if (absolutePath.endsWith(.class)) {//2.分割出类名String className absolutePath.substring(absolutePath.lastIndexOf(\\) 1, absolutePath.indexOf(.));//3.得到全路径String fullPath path.replace(/, .) . className;//4.类加载器获取Class对象也可以通过Class.forName区别是后者会使类被静态初始化判断是否有那四个注解Class? aClass classLoader.loadClass(fullPath);if (aClass.isAnnotationPresent(Component.class) || aClass.isAnnotationPresent(Controller.class)|| aClass.isAnnotationPresent(Service.class) || aClass.isAnnotationPresent(Repository.class)) {//5.反射对象并放入到容器中Class? clazz Class.forName(fullPath);Object o clazz.newInstance();//默认是类名首字母小写作为keyioc.put(StringUtils.uncapitalize(className), o);}}}System.out.println(ok);}}//返回容器中的对象public Object getBean(String name) {return ioc.get(name);}}
6.测试
package com.sxs.spring.annotation;import org.junit.jupiter.api.Test;/*** author 孙显圣* version 1.0*/
public class test {Testpublic void SunSpringApplicationContextTest() throws ClassNotFoundException, InstantiationException, IllegalAccessException {SunSpringApplicationContext ioc new SunSpringApplicationContext(SunSpringConfig.class);Object myComponent ioc.getBean(myComponent);Object userAction ioc.getBean(userAction);Object userDao ioc.getBean(userDao);Object userService ioc.getBean(userService);System.out.println( myComponent userService userAction userDao);}
} 3.自动装配
1.AutoWired方式
1.基本说明 2.UserDao.java
package com.sxs.spring.component;import org.springframework.stereotype.Repository;/*** Repository 用来标识该类是一个dao* author 孙显圣* version 1.0*/
Repository
public class UserDao {public void sayHi() {System.out.println(hi);}
}
3.UserService.java
package com.sxs.spring.component;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** Service 用于标识该类是一个Service* author 孙显圣* version 1.0*/
Service
public class UserService {//自动装配//1.通过UserDao这个类型来匹配如果有多个实例则使用第二种方式匹配//2.通过userDao这个属性名字作为id匹配实例如果还是匹配不到则报错AutowiredUserDao userDao;public void sayHi() {userDao.sayHi();}
}
4.测试 //测试autowire自动装配Testpublic void autowireTest() {//获取容器ApplicationContext ioc new ClassPathXmlApplicationContext(beans05.xml);UserService bean ioc.getBean(userService, UserService.class);bean.sayHi();}2.Resource方式推荐
1.基本说明 2.UserDao.java
package com.sxs.spring.component;import org.springframework.stereotype.Repository;/*** Repository 用来标识该类是一个dao* author 孙显圣* version 1.0*/
Repository
public class UserDao {public void sayHi() {System.out.println(hi);}
}
3.UserService.java
package com.sxs.spring.component;import org.springframework.stereotype.Service;import javax.annotation.Resource;/*** Service 用于标识该类是一个Service* author 孙显圣* version 1.0*/
Service
public class UserService {//自动装配//1.通过name匹配直接根据注解的属性name来进行匹配如果匹配不到直接报错//2.通过类型匹配必须保证是单例的如果有多个实例则直接报错//3.默认先通过name属性匹配如果匹配不上则按照类型匹配都匹配不上才会报错ResourceUserDao userDao;public void sayHi() {userDao.sayHi();}
}
4.泛型依赖注入
1.基本说明
1.基本介绍 2.参考关系图