基于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. linux c 打印彩色字符

    #include <stdio.h> #include <string.h> int main(int argc, char **argv) { , j = , str_len ...

  2. ORA-14404

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  3. Large-Scale Deployment of SharePoint Team Services

    http://technet.microsoft.com/en-us/library/cc723713.aspx

  4. VBS基础篇 - wscript 对象

    一.wscript对象 描述:提供对 Windows 脚本宿主对象模型根对象的访问.详述:WScript 对象是 Windows 脚本宿主对象模型层次结构的根对象.它可在任何脚本文件中使用,不需要特定 ...

  5. highCharts 电流表、电压表

    var highChartsSettingV = { chart: { margin: [5, 2, 5, 8], type: 'gauge', plotBorderWidth: 1, plotBac ...

  6. 在VisualStudio 2012上使用MVC3出现错误的解决办法

    1. 错误: 找不到方法:“System.Collections.Generic.Dictionary`2<System.String,BlockParser> System.Web.Ra ...

  7. C++实现简单的内存池

    多进程编程多用在并发服务器的编写上,当收到一个请求时,服务器新建一个进程处理请求,同时继续监听.为了提高响应速度,服务器采用进程池的方法,在初始化阶段创建一个进程池,池中有许多预创建的进程,当请求到达 ...

  8. android编程常见问题-No Launcher activity found!

    新手编程常见的问题: 问题表现: console提示:No Launcher activity found! The launch will only sync the application pac ...

  9. tomcat内存溢出,设置

    tomcat/bin/catalina.bat里找到echo Using CATALINA_BASE:   "%CATALINA_BASE%" ,在上方设置:    set JAV ...

  10. oracle 判断是否数字 正则表达式法

     SELECT '-100'    FROM dual   WHERE REGEXP_LIKE('-100','(^[+-]?\d{0,}\.?\d{0,}$)'); REGEXP_LIKE 用法: ...