springday02(注解)

注释:给你看的提示信息
注解:给程序看的提示信息
jdk5开始提供的新特性,程序可以通过是否具有注解,注解上配置的属性的值的不同来控制程序按不同的方式运行。通常用来在程序中实现轻量化的配置。
常用的注解:
Deprecated过时
Override重写
SuppressWarnings警告压制
自定义注解:
1.开发一个注解的过程非常类似于开发一个接口,但是要通过@interface关键字来声明
2.通过元注解来修饰注解类
所谓元注解是用来修饰注解类的注解,可以控制自定义注解的相关特性
@Target:声明当前的自定义注解可以用在什么位置,可以通过ElementTyp类型来设置,如果不设置默认可以用在任意的位置。
@retention:声明当前的自定义注解要保留到什么阶段,可以通过retentionPolicy来配置
.java----编译器----.class------类加载器------字节码文件
retentionPolicy.SOURCE此自定义注解只会在源码阶段保留,在编译器阶段删除,通常是给编译器看的。
retentionPolicy.CLASS此自定义注解在.java和.class中保留,但加载到内存中变为字节码才会被清除,通常给类加载器看的。
retentionPolicy.RUNTIME此自定义注解会在.java和.class和内存中的字节码中保留,只有runtime级别的注解才能在运行阶段进反射,被这个修饰的就是runtime级别的注解。
@documented
默认情况下注解是不会被提取到文档中的,声明当前的注解是否可以被文档提取工具提取到文档中。
@Inherited
注解是否具有继承性
3.为注解增加属性:
注解类中还可以增加属性
为注解类声明属性的过程非常类似于给接口定义方法
但是要求注解中所有的属性必须是public的,可以显示声明也可以不声明,不声明默认就是public。
注解中的属性只能是八种基本数据类型String类型,class类型,其它注解类型及以上类型的一维数组。
注解中声明的属性需要在使用注解时为其赋值,赋值的方式就是使用注解时在注解后跟一对小括号,在其中通过属性名=属性值的方式指定属性的值。也可以在声明注解时,在注解的属性后通过default关键字声明属性的默认值,声明过默认值的属性可以在使用注解时不赋值,则默认采用默认值,也可以手动赋值覆盖默认值。
如果属性是一维数组类型,而在传入数组中只有一个值,则包括数据的大括号可以省略。
如果注解的属性只有一个需要赋值,且该属性的名称叫做value,则在使用注解时,value=可以不写。
4.反射注解:
retentionPolicy.RUNTIME级别的注解会保留到运行时,可以通过反射技术来获取
可以在程序中通过反射技术获取注解的信息来控制程序

Class 
   Annotation[] getAnnotations()
   返回此元素上存在的所有注解
   <A extends Annotation>
   A getannotation(Class <A> annotionClass)
   如果存在该元素的指定类型的注解,则返回这些注解
   boolean isAnnotationPresent(Class<? extends Annotation)
   如果指定类型的注解存在于此元素上,则返回true

spring注解
1.spring注解
spring支持使用注解方式实现配置,这中方式效率高,配置信息清晰,修改更方便,推荐使用
2.spring引入context名称空间
在myeclipse中导入spring-context-3.2.xsd约束文件,要求spring来管理
3.spring注解方式使用IOC
a.使用注解注册bean
在配置的包中的类上使用@Component注解,则这个类会被自动注册为bean,使用当前类的class为bean的class,通常情况下使用类名首字母小写为bean的id
c.bean的id
通常情况下注解注册bean使用类名首字母小写为bean的id,但是如果类名的第二个字母为大写,则首字母保留原样(比如NBA)
也可以通过在@Component中配置value属性,明确指定bean的id

4.类中存在自定义的bean:
当spring容器解析到@Component注解时,创建当前类的bean在spring容器中进行管理,在创建bean的过程中发现了@Autowired注解,会根据当前bean的类型,寻找在spring中是否存在该类型的bean属性,如果存在自动注入,如果找不见还会检查是否有子类、实现类存在,如果存在自动注入,如果还是没有信号到则接着根据id去查询对应的bean,如果存在则注入,如果还是没有找到则抛出异常@Qualifier(value=“dog”)注解,明确指定要根据id注入指定的bean
5.其他注解
a.@scop(value=“prototype”)
配置修饰类的bean是单例还是多例,如果不配置默认为单例
b.Lazy
配置修饰的类的bean采用懒加载机制
c.通过@PostConstruct和@PreDestroy注解来为bean配置初始化和销毁的方法
d.@Controller @Service @Repository @Component
这四个注解的功能是完全相同的,都是用来修饰类的,将类声明为spring管理的bean
@Component一般认为是通用的注解
@Controller用在软件分层的控制层,一般用在web层
@Service用在软件分层的业务访问层,一般用在service层
@Repository用在软件分层的数据访问层,一般用带dao层

代码实现:
配置的Javabean

package cn.tedu.domain;
import org.springframework.stereotype.Component;
@Component
public interface Ani {

}
package cn.tedu.domain;
import org.springframework.stereotype.Component;
@Component
public class Cat {
}
package cn.tedu.domain;
import org.springframework.stereotype.Component;
@Component
public class Dog {

}
package cn.tedu.domain;
import org.springframework.stereotype.Component;
@Component("person1")
public class Person {
	
}
package cn.tedu.domain;
import org.springframework.stereotype.Component;
@Component
public class PErson2 {	
}
package cn.tedu.domain;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class Person3 {
	@Value("ww")
	//@Value("${name}")
	private String name;
	@Value("18")
	//@Value("${age}")
	private int age;
	@Value("#{@l1}")
	private List<String> list;
	@Value("#{@s1}")
	private Set<String> set;
	@Value("#{@m1}")
	private Map<String,String> map;
	@Value("#{@p1}")
	private Properties prop;
	@Override
	public String toString() {
		return "Person3 [name=" + name + ", age=" + age + ", list=" + list
				+ ", set=" + set + ", map=" + map + ", prop=" + prop + "]";
	}
}

package cn.tedu.domain;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class Person4 {
	@Value("ww")
	private String name;
	@Value("18")
	private int age;
	@Autowired
	private Dog dog;
	@Autowired
	private Cat cat;
	@Autowired
	@Qualifier("tiger")
	private Ani ani;
	@Override
	public String toString() {
		return "Person4 [name=" + name + ", age=" + age + ", dog=" + dog
				+ ", cat=" + cat + ", ani=" + ani + "]";
	}
	
	
}

package cn.tedu.domain;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
//@Scope("prototype")
@Lazy
public class Person5 {
	public Person5(){
		System.out.println("对象创建");
	}
	@Value("ww")
	private String name;
	@Value("19")
	private int age;
}

package cn.tedu.domain;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.stereotype.Component;
@Component
public class Person6 {
	@PostConstruct
	public void init(){
		System.out.println("初始化");
	}
	@PreDestroy
	public void destory(){
		System.out.println("销毁");
	}
}

package cn.tedu.domain;
import org.springframework.stereotype.Component;
@Component
public class Pig implements Ani{
}
package cn.tedu.domain;
import org.springframework.stereotype.Component;
@Component
public class Tiger implements Ani{
}
package cn.tedu.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.tedu.domain.Dog;
import cn.tedu.domain.PErson2;
import cn.tedu.domain.Person;

public class Test01 {
	/**
	 * 通过注解方式注册bean时,会自动推断bean的id,规则如下
	 * 如果类名第二个字母小写,则将首字母小写,其它不变作为id
	 * 如果类名第二个字母大写,则首字母不变,其它不变作为id
	 * 也可以通过@Component("person1")手动指定id
	 */
	@Test
	public void test01(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
		Person p=(Person) context.getBean("person1");
		Dog dog=(Dog) context.getBean("dog");
		PErson2 p2=(PErson2) context.getBean("PErson2");
		System.out.println(p);
		System.out.println(2);
		System.out.println(dog);
	}
}

package cn.tedu.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.tedu.domain.Ani;
import cn.tedu.domain.Dog;
import cn.tedu.domain.PErson2;
import cn.tedu.domain.Person;
import cn.tedu.domain.Person3;
import cn.tedu.domain.Person4;
import cn.tedu.domain.Person5;
import cn.tedu.domain.Person6;

public class Test02 {
	/**
	 * 通过@Value实现DI,通过${xx}引用外部配置文件中的属性
	 */
	@Test
	public void test01(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
		Person3 p=(Person3) context.getBean("person3");
		System.out.println(p);
	}
	/**
	 * 对于集合类型可以在spring配置文件中通过util标签配置值
	 * 之后可以在bean中@Value实现DI,通过#{@id}引用
	 */
	@Test
	public void test02(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
		Person3 p=(Person3) context.getBean("person3");
		System.out.println(p);
	}
	/**
	 * 对于bean类型可以通过自动装配机制完成注入
	 */
	@Test
	public void test03(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
		Person4 p=(Person4) context.getBean("person4");
		System.out.println(p);
	}
	/**
	 * 接口类型引入它的子类(自动装配),或者设置id根据id寻找对应的bean
	 */
	@Test
	public void test04(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
		Person4 p=(Person4) context.getBean("person4");
		System.out.println(p);
	}
	/**
	 * 通过@Scope注解控制bean是单例还是多例,通过@Lazy注解控制bean是否需要懒加载
	 */
	@Test
	public void test05(){
		ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
		Person5 p=(Person5) context.getBean("person5");
		Person5 p2=(Person5) context.getBean("person5");
		System.out.println(p);
		System.out.println(p2);
	}
	/**
	 * 可以通过@PostConstruct和@PreDestroy注解来为bean配置初始化和销毁的方法
	 */
	@Test
	public void test06(){
		ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext2.xml");
		Person6 p=(Person6) context.getBean("person6");
		System.out.println(p);
		context.close();
	}
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.2.xsd
	http://www.springframework.org/schema/util
	http://www.springframework.org/schema/util/spring-util-3.2.xsd
	 "	>
	 <!-- 配置IOC包扫描 -->
	<context:component-scan base-package="cn.tedu.domain"></context:component-scan>
	<!--加载prop配置文件  -->
	<context:property-placeholder location="classpath:/person.properties"/>
	<!-- 配置集合属性 -->
	<util:list id="l1">
		<value>v1</value>
		<value>v2</value>
		<value>v3</value>
	</util:list>
	<util:set id="s1">
		<value>sv1</value>
		<value>sv2</value>
		<value>sv2</value>
	</util:set>
	<util:map id="m1">
		<entry key="k1" value="v1"></entry>
		<entry key="k2" value="v2"></entry>
	</util:map>
	<util:properties id="p1">
		<prop key="pk1">pv1</prop>
		<prop key="pk2">pv2</prop>
	</util:properties>
</beans>

通过spring改造easymall项目

父子类的自动装配
方式一:

//@Repository("userDao")
@Repository
public class MysqlUserDao implements UserDao{

方式二和三:

@Service
public class UserServiceImpl implements UserService{
	@Autowired
	@Qualifier("mysqlUserDao")
	private UserDao userDao=null;
	//private UserDao mysqlUserDao=null;//不太好

SpringDay02_02em项目

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值