@Service( “itemService”)
公共类ItemServiceImpl实现ItemService {
//注解方式1:@Autowired加载方法上
// private ItemDao itemDao;
//
// @Autowired //根据形参的类型从spring容器中找符合ItemDao类型的bean,赋值形参
// @Qualifier(“itemDao1”)//如果不加这个ItemDao会有两个实现类spring不能知道注入哪个实现类报错
// public void setItemDao(ItemDao itemDao){
// this.itemDao = itemDao;
//}
//注解方式2:直接在字段上添加注解
// @Autowired
// @Qualifier(“itemDao2”)
// private ItemDao itemDao;
//注解方式3使用jdk注解指定名称
// @Resource(name =“itemDao2”)
// private ItemDao itemDao;
//注解方式4使用jdk注解指定类型
@Resource(type = ItemDaoImpl2.class)
private ItemDao itemDao;
@覆盖
public void insertItem(Item item){
//调用dao
itemDao.insertItem(项目);
}
}
autowried 和资源的区别
都可以完成属性注入, autowried 是春天提供的,资源是JavaEE的规范,如果系统的豆只有一个类型,可以使用自动装配Autowired ,如果豆有多个类型,需要自动装配Autowired 和预选赛结合使用
为了系统-和春天解耦合,建议使用资源,因为资源是jdk 的规范。
JSR-250标准注解,推荐使用它来代替弹簧专有的@Autowired注解。@资源的作用相当于@Autowired,只不过@Autowired按byType的自动注入,而@Resource默认按绰号自动注入,如果找不到再按类型找到bean。@Resource有两个属性是比较重要的,分别是名称和类型,Spring将@Resource注解的名称属性解析为bean的名字,而type为属性则解析为bean的类型。
@Resource装配的英文顺序
①如果同时指定了名称和类型,则从弹簧上下文中找到唯一匹配的豆进行装配,则找不到抛出异常
②如果指定了名称,则从上下文中查找名称(ID)匹配的豆进行装配,则找不到抛出异常
③如果指定了类型,则从上下文中找到类型匹配的唯一豆进行装配,找不到或者找到多个,抛出都会异常
④如果既没有指定名称,又没有指定型,则自动按照绰号方式进行装配(见②);如果没有匹配,则回退为一个原始类型(userDAO的)进行匹配,如果匹配 自动装配;
2> @PostConstruct和@PreDestory
实现初始化和销毁豆之前进行的操作,只能有一个方法可以用此注释进行注释,方法不能有参数,返回值必需是无效的,方法需要是非静态的。
@服务
公共类TestService {
@PostConstruct
public void init(){
的System.out.println( “初始化”);
}
@PreDestroy
public void dostory(){
的System.out.println( “销毁”);
}
}
@PostConstruct:在构造函数之后执行,init-method方法之前执行,且只会执行一次。
@PreDestory:注解的方法在destory()方法调用后得到执行。
引深一点,Spring容器中的Bean是有生命周期的,Spring允许在Bean中初始化完成后((执行构造函数))以及Bean销毁前(关闭容器)执行特定的操作,
1.通过实现InitializingBean / DisposableBean接口来定制初始化之后/销毁之前的操作方法;
2.通过<bean>元素的init-method / destroy-method属性指定初始化之后/销毁之前调用的操作方法(@Bean@Bean指定指定init-methodinit-method和和destroy-methoddestroy-method);
3.在指定方法上加上@PostConstruct或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用(注意:要配合xml中的<context:annotation-config />才能生效)
4.在配置文件中配置全局初始化完成后的, Bean销毁前执行方法 xml中配置: default-init-method =“init”default-destroy-method =“teardown”>
当配置了init-method方法时,default-init-method不生效,否则相反
注意:default-init-method指定的方法可以在实体类中没有,但是init-method必须的有否则报错
执行先后顺序。构造函数> @PostConstruct> InitializingBean> init方法
3> @Lazy(真)
用于指定该豆是否取消预初始化,用于注解类,延迟初始化
4> context:annotation-config和context:component-scan区别
context:annotation-config将在配置文件中添加上下文:annotation-config标签使@资源,@ PostConstruct,@ PreDestroy,@ Autowired注解生效,主要任务是激活注解。
上下文:注解配置只针对容器中已经存在豆。
上下文:组分扫描除了具有<上下文:注解的配置/>的功能之外,还具有自动将带有@部件,@服务,@库等注解的对象注册到春天容器中的功能。
如果使用了<context:component-scan>所以可以去掉<context:annotation-config>
<context:component-scan base-package =“com.cn.hnust,com.cn.fpc,com.cn.zl”/ >多个包逗号隔开。
5>单元测试 spring-test.jar spring-test-3.2.0.RELEASE.jar
import cn.itcast.spring.pojo.Orders;
import cn.itcast.spring.service.OrderService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//基于SpringJUnit4ClassRunner会读取配置文件,自动创建容器,将容器中的豆自动注入到此测试对象
@RunWith(SpringJUnit4ClassRunner.class)来
@ContextConfiguration(位置= { “类路径:applicationContext.xml中”})
公共类springJunit {
@Autowired
OrderService orderService;
@之前
public void before(){
System.out.println(“hello world”); //执行测之前先执行
}
@测试
public void saveOrder(){
orderService.saveOrder(new Orders());
}
}
applicationContext.getBean( '')指定的bean 的ID或名称即可获取
@WebServlet(value={"/hello"})=@WebServlet( {"/hello"})= @WebServlet( "/hello") value默认可以去除
value对应的值是String[ ] 如果是单个字符串的情况下也能不用{ }
spring注解资料:: https://www.cnblogs.com/digdeep/p/4525567.html
https://blog.csdn.net/achenyuan/article/details/72786759