基于XML的配置,Bean定义信息和Bean实现类本身是分离的,而采用基于注解的配置方式时,Bean定义信息即通过在Bean实现类上标注注解实现。

@Component:对类进行标注,Spring容器自动将POJO转换为容器管理的Bean;
@Repository:用于对DAO实现类进行标注;
@Service:用于对Service实现类进行标注;
@Controller:用于对Controller实现类进行标注。
 
1、自动装配Bean:
 
beans.xml:

<?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
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
>
<context:component-scan base-package="com.ioc.ch4_10"/>
<bean id="ls" class="com.ioc.ch4_10.LogonService"></bean>
<!-- context:component-scan base-package="com.baobaotao" resource-pattern="anno/*.class"/ -->
<!-- context:component-scan base-package="com.baobaotao">
<context:include-filter type="regex" expression="com\.baobaotao\.anno.*Dao"/>
<context:include-filter type="regex" expression="com\.baobaotao\.anno.*Service"/>
<context:exclude-filter type="aspectj" expression="com.baobaotao..*Controller+"/>
</context:component-scan -->
</beans>

LogDao类:

package com.ioc.ch4_10;
import org.springframework.stereotype.Component;
@Component("logDao")
public class LogDao {
}

UserDao_1类:

package com.ioc.ch4_10;
import org.springframework.stereotype.Component;
@Component("userDao_1")
//自动被Spring容器识别,Spring容器自动将POJO转换为容器管理的Bean
//等价于XML配置的<bean id="userDao_1" class="com.ioc.ch4_10.UserDao_1">
public class UserDao_1 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "UserDao_1{" +
"name='" + name + '\t' +
'}';
}
public UserDao_1() {
System.out.println("userDao");
}
}

UserDao_2类:

package com.ioc.ch4_10;
import org.springframework.stereotype.Component;
/**
* Created by gao on 16-3-25.
*/
@Component("userDao_2")
public class UserDao_2 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "UserDao_2{" +
"name='" + name + '\t' +
'}';
}
public UserDao_2() {
System.out.println("userDao_2");
}
}

UserDao_3类:

package com.ioc.ch4_10;
import org.springframework.stereotype.Component;
/**
* Created by gao on 16-3-25.
*/
@Component("userDao_3")
public class UserDao_3 {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "UserDao_3{" +
"name='" + name + '\t' +
'}';
}
public UserDao_3() {
System.out.println("userDao_3");
}
}

LogonService类:

package com.ioc.ch4_10;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class LogonService{
//使用@Autowired进行自动注入
@Autowired
private LogDao logDao;
@Autowired
private UserDao_1 userDao1;
//使用@Autowired的required属性,设置为false表示找不到匹配的Bean完成注入也不要抛出异常
@Autowired(required = false)
private UserDao_2 userDao_2;
//使用@Qualifier指定注入Bean的名称
@Autowired
@Qualifier("userDao_3")
private UserDao_3 userDao_3;
public LogDao getLogDao() {
return logDao;
}
public UserDao_1 getUserDao1() {
return userDao1;
}
public UserDao_2 getUserDao2() {
return userDao_2;
}
public UserDao_3 getUserDao3() {
return userDao_3;
}
public void printSomething(){
userDao1.setName("LogonService-userDao1");
System.out.println(userDao1.toString());
userDao_2.setName("LogonService-userDao2");
System.out.println(userDao_2.toString());
userDao_3.setName("LogonService-userDao3");
System.out.println(userDao_3.toString());
}
}

LoginService_2类:

package com.ioc.ch4_10;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
/**
* Created by gao on 16-3-25.
*/
@Service
public class LogonService_2 {
private LogDao logDao;
private UserDao_1 userDao_1;
//自动将LogDao传给方法入参
@Autowired
public void setLogDao(LogDao logDao) {
System.out.println("auto setlogdao");
this.logDao = logDao;
}
//自动将名为userDao的Bean传给方法入参
@Autowired
public void setUserDao_1(UserDao_1 userDao_1) {
System.out.println("auto setuserdao");
this.userDao_1 = userDao_1;
}
@Autowired
public void init(@Qualifier("userDao_1")UserDao_1 userDao,LogDao logDao){
System.out.println("multi param inject");
this.userDao_1 = userDao;
this.logDao =logDao;
}
}

测试类:

package com.ioc.ch4_10;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by gao on 16-3-25.
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com\\ioc\\ch4_10\\beans.xml");
LogonService ls = (LogonService) ctx.getBean("ls");
ls.printSomething();
}
}
输出结果:
userDao
userDao_2
userDao_3
multi param inject
auto setlogdao
auto setuserdao
UserDao_1{name='LogonService??userDao1}
UserDao_2{name='LogonService-userDao2 }
UserDao_3{name='LogonService-userDao3 }
 
 
2、对集合类进行标注
Plugin接口:

package com.ioc.ch4_10;
public interface Plugin {
}

onePlugin类:

package com.ioc.ch4_10;
import org.springframework.stereotype.Component;
@Component
public class OnePlugin implements Plugin {
}

twoPlugin类:

package com.ioc.ch4_10;
import org.springframework.stereotype.Component;
@Component
public class TwoPlugin implements Plugin {
}

MyComponent类:

package com.ioc.ch4_10;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class MyComponent {
//Spring会将容器中所有类型为Plugin的Bean注入到这个变量中
@Autowired(required=false)
private List<Plugin> plugins;
public List<Plugin> getPlugins() {
return plugins;
}
}

mycomponent.xml:

<?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
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.ioc.ch4_10">
<context:include-filter type="aspectj" expression="com.baobaotao.anno.*Plugin+"/>
<context:include-filter type="aspectj" expression="com.baobaotao.anno.MyComponent"/>
</context:component-scan>
</beans>

MyComponentTest类:

package com.ioc.ch4_10;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyComponentTest {
public static void main(String[] args) throws Throwable {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com\\ioc\\ch4_10\\mycomponent.xml");
MyComponent myComponent = ctx.getBean(MyComponent.class);
System.out.println("pulgin.size:"+myComponent.getPlugins().size()); }
}
输出结果:
userDao
userDao_2
userDao_3
multi param inject
auto setlogdao
auto setuserdao
pulgin.size:2
 
3、Bean作用范围及生命过程方法
使用Scope指定作用范围
package com.ioc.ch4_10;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
//指定Bean的作用范围为prototype
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Component
public class Car {
private int maxSpeed;
public String brand;
private double price; ......
}

Boss类:

package com.ioc.ch4_10;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
@Component
public class Boss { private Car car;
public Boss(){
System.out.println("construct...");
}
@Resource
private void setCar(Car car){
System.out.println("execute in setCar");
this.car = car;
} @PostConstruct
private void init1(){
System.out.println("execute in init1");
} @PostConstruct
private void init2(){
System.out.println("execute in init1");
} @PreDestroy
private void destory1(){
System.out.println("execute in destory1");
} @PreDestroy
private void destory2(){
System.out.println("execute in destory2");
}
}

测试类:

package com.ioc.ch4_10;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by gao on 16-3-25.
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com\\ioc\\ch4_10\\beans.xml"); Car car1 = (Car) ctx.getBean("car");
Car car2 = (Car) ctx.getBean("car");
System.out.println(car1 == car2); //false
UserDao_2 ud1 = (UserDao_2) ctx.getBean("userDao_2");
UserDao_2 ud2 = (UserDao_2) ctx.getBean("userDao_2");
System.out.println(ud1 == ud2); //true
((ClassPathXmlApplicationContext)ctx).destroy();
}
}
输出结果:
construct...
execute in setCar
execute in init1
execute in init1
false
true
execute in destory2
execute in destory1

Spring IoC — 基于注解的配置的更多相关文章

  1. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

  2. Spring IoC — 基于XML的配置

    1.属性注入 注意点: 1)如果类中显示定义了一个带参的构造函数,则一定还要显示提供一个无参构造函数,否则使用属性注入时将抛出异常. 2)JavaBean关于属性命名的特殊规范.Spring只会检查B ...

  3. (spring-第4回【IoC基础篇】)spring基于注解的配置

    基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现类上标注注解实现. 也就是说,加了注解,相当于在XML中配置了,一样 ...

  4. Spring框架bean的配置(3):基于注解的配置

    1.基于注解的配置: @Component: 基本注解, 标识了一个受 Spring 管理的组件 @Respository: 标识持久层组件 @Service: 标识服务层(业务层)组件 @Contr ...

  5. Spring IoC — 基于Java类的配置

    普通的POJO只要标注@Configuration注解,就可以为Spring容器提供Bean定义的信息了,每个标注了@Bean的类方法都相当于提供一个Bean的定义信息. 基于Java类的配置方法和基 ...

  6. Spring基于注解@Required配置

    基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...

  7. Spring 基于注解零配置开发

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...

  8. Spring 基于注解的配置 简介

    基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...

  9. Spring:基于注解的Spring MVC

    什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...

随机推荐

  1. Java从入门到精通——数据库篇之JAVA中的对Oracle数据库操作

    在Java中对Oracle数据库的操作分为两种:一.查询.二.非查询. 下面是我对其进行总结: 一.查询数据 /** * 根据用户代码查询 * @param userId * @return 如果存在 ...

  2. dblink 的源数据表结构修改后在存储过程里执行报错

    原情况:A服务器表A服务器B也有一张表A服务器B上有一个存储过程要把本地的head表向A服务器表里插入数据.变更后:在A服务器表里增加了一个字段inserttime,服务器B存储过程本地表向A服务器插 ...

  3. 【quartz】 数据库方式管理任务

    public static void Run(bool inClearJobs, bool inScheduleJobs) { var properties = new NameValueCollec ...

  4. mac升级yosemite后安装gd的freetype扩展

    Mac升级系统到 Yosemite 10.10,对于各位Coder来说,还是需要一些时间来折腾的! @星空之下 同学反映 PHPCMS 的验证码图片不能正常显示,反馈该验证码需要GD库支持FreeTy ...

  5. 幻灯slider

    <style> .focusBox { position: relative; width: 340px; height: 240px; overflow: hidden; font: 1 ...

  6. Java并发编程:Lock(上)

    在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方 ...

  7. iOS xcode 8 注释快捷键

    单行注释:在方法的地方按 Command+/ 标注的功能,快捷键是Command + Option + / 需要在方法名的上面(空白)的地方按 Command + Option + /      才管 ...

  8. WPF解析TTF 字体

    偶遇需要自己解析 TTF 字体并显示,此做... using System; using System.Collections.Generic; using System.Drawing.Text; ...

  9. mysql innodb 引擎

    innodb 引擎 一.概述 InnoDB 是一个用的比较广泛的存储引擎,因为它支持事物和外键,还有不错的效率;我们先看看官方教程怎么说; 我们先读一下, 对于上面的文档, 对一个InnoDB的表首先 ...

  10. jquery 图片背景透明度(支持IE5/IE6/IE7)

    设置背景图片,以突出透明度的效果及jquery png背景透明插件实例教程 <head> <title>toggle()</title> <style typ ...