做前端网站要注意哪些网站建设模板怎么设计
news/
2025/9/29 21:54:34/
文章来源:
做前端网站要注意哪些,网站建设模板怎么设计,wordpress升级设置密码,时尚工作室网站源码注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 注解开发的优点:提高开发效率 注解开发的缺点:在一定程度上违背了OCP原则#xff0c;使用注解的开发的前提是需求比较固定#xff0c;变动较小。
1 注解的注解称为元注解
自定义一个注解:
package com.sunspl…注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 注解开发的优点:提高开发效率 注解开发的缺点:在一定程度上违背了OCP原则使用注解的开发的前提是需求比较固定变动较小。
1 注解的注解称为元注解
自定义一个注解:
package com.sunsplanter.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;Target(value {ElementType.TYPE,ElementType.FIELD})
Retention(value RetentionPolicy.RUNTIME)
public interface Component {String value();
}该注解上面修饰的注解包括Target注解和Retention注解这两个注解被称为元注解。Target注解用来设置Component注解可以出现的位置以上代表表示Component注解只能用在类和接口上。Retention注解用来设置Component注解的保持性策略. SOURCE:注解只被保留在Java源文件中,class文件不包含注解. CLASS:注解最终被保留到class文件中,但不能被反射机制读取. RUNTIME:注解最终被保留到class文件中,并且可以被反射机制读取.
String value(); 是Component注解中的一个属性。该属性类型String属性名是value。
2 管中窥豹注解的作用-通过反射机制读取注解
目标:只知道报包名com.sunsplanter.bean,至于这个包下有多少个Bean我们不知道。哪些Bean上有注解都不知道. 通过程序全自动化判断: 若Bean类上有Component注解时则实例化Bean对象如果没有则不实例化对象。
我们准备两个Bean一个上面有注解一个上面没有注解。
package com.sunsplanter.bean;import com.sunsplanter.annotation.Component;Component(userBean)
public class User {
}package com.sunsplanter.bean;public class Vip {
}package com.sunsplanter.test;import com.sunsplanter.annotation.Component;import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;public class Test {public static void main(String[] args) throws Exception {// 存放Bean的Map集合。key存储beanId。value存储Bean。MapString,Object beanMap new HashMap();String packageName com.sunsplanter.bean;//将com.sunsplanter.bean转化成com/sunsplanter/bean并存到path中String path packageName.replaceAll(\\., /);//获取这个包在系统中的绝对路径:file:/D:/study/spring6/spring6-005-Annotation/target/classes/com/sunsplanter/beanURL url ClassLoader.getSystemClassLoader().getResource(path);//获取一个绝对路径下的所有子文件,并写入文件数组File file new File(url.getPath());File[] files file.listFiles();Arrays.stream(files).forEach(f - {//获取两个类的相对包路径,如com.sunspalnter.bean.User...String className packageName . f.getName().split(\\.)[0];try {Class? clazz Class.forName(className);if (clazz.isAnnotationPresent(Component.class)) {Component component clazz.getAnnotation(Component.class);String beanId component.value();Object bean clazz.newInstance();beanMap.put(beanId, bean);}} catch (Exception e) {e.printStackTrace();}});System.out.println(beanMap);}
}3 声明Bean的注解
通过注解声明该类是一个bean类,今后就会被自动创建bean对象.
负责声明Bean的注解常见的包括四个
ComponentControllerServiceRepository
通过源码可以看到Controller、Service、Repository这三个注解都是Component注解的别名。 也就是说这四个注解的功能都一样, 只是为了增强程序的可读性建议
● 控制器类上使用Controller(主要用于给前端返回数据的以及接收前端的数据的) ● service类上使用Service(处理数据用的) ● dao类上使用Repository 他们都是只有一个value属性。value属性用来指定bean的id也就是bean的名字。
4 Spring注解的使用
如果使用以上的注解, 就不必再每一个类都使用一个bean标签管理. 如何使用以上的注解呢 ● 第一步加入aop的依赖 ● 第二步在配置文件中添加context命名空间 ● 第三步在配置文件中指定扫描的包 ● 第四步在Bean类上使用注解
第一步加入aop的依赖 当加入spring-context依赖之后会关联加入aop的依赖。所以这一步不用做。
第二步在配置文件中添加context命名空间, 分别是xmlns:context和xsi:schemeLocation
?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
/beans第三步在配置文件中指定要扫描的包
?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdcontext:component-scan base-packagecom.sunsplanter.bean/
/beans第四步在Bean类上使用注解
package com.sunsplanter.bean;import org.springframework.stereotype.Component;Component(value userBean)
public class User {
}第四步要小心, 存在两个两个Component 第二个时上面学习时自己建的,一定要选第一个.
第五步编写测试程序
package com.sunsplanter.test;import com.sunsplanter.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnotationTest {Testpublic void testBean(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);User userBean applicationContext.getBean(userBean, User.class);System.out.println(userBean);}
}成功输出一个对象.
如果注解的属性名是value那么value是可以省略的。 例如:
package com.sunsplanter.bean;import org.springframework.stereotype.Component;Component(userBean)
public class User {
}package com.sunsplanter.test;import com.sunsplanter.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class AnnotationTest {Testpublic void testBean(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);User userBean applicationContext.getBean(userBean, User.class);System.out.println(userBean);}
}仍能输出一个User对象.
甚至: 如果把value属性彻底去掉该类在被创建成bean时会被自动指定一个bean id(名字), 默认名字的规律是Bean类名首字母小写即可。
多个包需要扫描的情况 办法1(常用): 指定需要扫描的多个包的共同父包,扫描这个共同父包. 缺点是如果父包有不需要扫描的包,则会牺牲一些效率. 办法2: 逗号分隔多个需要扫描的包: context:component-scan base-packagecom.sunsplanter.bean,com.sunsplanter.dao/5 根据注解类型选择性实例化Bean
假设在某个包下有很多Bean有的Bean上标注了Component有的标注了Controller有的标注了Service有的标注了Repository. 目标: 现在由于某种特殊业务的需要只允许其中所有的Controller参与Bean管理其他的都不实例化。
这里为了方便将这几个类都定义到同一个java源文件中了:
package com.sunsplanter.spring6.bean3;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;Component
public class Selective_Instantiation_of_Objects{public Selective_Instantiation_of_Objects() {System.out.println(A的无参数构造方法执行);}
}Controller
class B {public B() {System.out.println(B的无参数构造方法执行);}
}Service
class C {public C() {System.out.println(C的无参数构造方法执行);}
}Repository
class D {public D() {System.out.println(D的无参数构造方法执行);}
}Controller
class E {public E() {System.out.println(E的无参数构造方法执行);}
}?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
!--
use-default-filterstrue 表示使用spring默认的规则只要有Component、Controller、Service、Repository中的任意一个注解标注则进行实例化。
use-default-filtersfalse 表示不再spring默认实例化规则即使有Component、Controller、Service、Repository这些注解标注也不再实例化。
context:include-filter typeannotation expressionorg.springframework.stereotype.Controller/ 表示只有Controller进行实例化。--context:component-scan base-packagecom.sunsplanter.bean use-default-filtersfalsecontext:include-filter typeannotation expressionorg.springframework.stereotype.Controller//context:component-scan/beans测试程序:
Test
public void testChoose(){ApplicationContext applicationContext new ClassPathXmlApplicationContext(spring-choose.xml);
}输出注解为Controller的B,E构造方法执行.
目标: 现在由于某种特殊业务的需要除了Controller外的所有注解都参与Bean管理仅Controller实例化。
!--
use-default-filterstrue 表示使用spring默认的规则只要有Component、Controller、Service、Repository中的任意一个注解标注则进行实例化。(不写默认是true)
use-default-filtersfalse 表示不再spring默认实例化规则即使有Component、Controller、Service、Repository这些注解标注也不再实例化。
context:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller/ 表示将Controller排除出实例化的范围。--context:component-scan base-packagecom.sunsplanter.beancontext:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller//context:component-scan
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922276.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!