Spring的核心就是提供了一个IoC(Inversion of Control)容器,它可以管理所有轻量级的JavaBean组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP支持,以及建立在AOP基础上的声明式事务服务等。
本本主要展示IoC容器对JavaBean装配,以及依赖的注入的几种方式。
看本文之前请务必学习JAVA基础。
1 传统的实现方式
先来看下面这个例子:
class Person {
private String name;
public Person(){};
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Dance {
public void do_dance(Person person){
System.out.println(person.getName()+" is dancing!");
}
}
class Sing {
public void do_sing(Person person){
System.out.println(person.getName()+" is sing!");
}
}
public class Test {
public static void main(String[] args) {
Person person=new Person("Ming");
new Sing().do_sing(person);
new Dance().do_dance(person);
}
}
package model;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Dance
package model;
public class Dance {
Person person;
public void setPerson(Person person){
this.person=person;
}
public void do_dance(){
System.out.println(person.getName()+" is dancing!");
}
}
Sing
package model;
public class Sing {
Person person;
public void setPerson(Person person) {
this.person = person;
}
public void do_sing(){
System.out.println(person.getName()+" is sing!");
}
}
Dance、Sing自己并不会创建Person,而是等待外部通过set方法来注入一个Person:
Bean的定义交给XML
Main中通过context来访问XML文件
import model.Dance;
import model.Person;
import model.Sing;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("Application.xml");
Dance dance=context.getBean(Dance.class);
dance.do_dance();
Sing sing=context.getBean(Sing.class);
sing.do_sing();
Person person=context.getBean(Person.class);
person.setName("Tom");
Dance dance_=context.getBean(Dance.class);
dance_.do_dance();
Sing sing_=context.getBean(Sing.class);
sing_.do_sing();
}
}
运行结果
Ming is dancing!
Ming is sing!
Tom is dancing!
Tom is sing!
package model;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Dance
package model;
public class Dance {
Person person;
public Dance(Person person) {
this.person=person;
}
public void do_dance(){
System.out.println(person.getName()+" is dancing!");
}
}
Sing
package model;
public class Sing {
Person person=new Person();
public void setPerson(Person person){
this.person=person;
}
public void do_sing(){
System.out.println(person.getName()+" is sing!");
}
}
APPConfig
import model.Dance;
import model.Person;
import model.Sing;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class APPConfig {
@Bean
public Person person(){
Person person=new Person();
person.setName("Ming");
return person;
}
@Bean //通过构造器的注入依赖
public Dance dance(@Autowired Person person){
return new Dance(person);
}
@Bean //通过set注入依赖
public Sing sing(){
Sing sing= new Sing();
sing.setPerson(person());
return sing;
}
}
package model;
import org.springframework.stereotype.Component;
@Component
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Dance
package model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Dance {
@Autowired //替代了set
Person person;
public void do_dance(){
System.out.println(person.getName()+" is dancing!");
}
}
Sing
package model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Sing {
@Autowired
Person person;
public void do_sing(){
System.out.println(person.getName()+" is sing!");
}
}
范型参数不仅仅可以用于类型的声明上,例如
package com.tom.lang.generics;
import java.util.List;
public class Generics<T> {
private T value;
public Generics(T value) {
this.value =
How to generate a globally unique identifier in Java
http://stackoverflow.com/questions/21536572/generate-unique-id-in-java-to-label-groups-of-related-entries-in-a-log
http://stackoverflow
SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern']
SHOW TABLES列举了给定数据库中的非TEMPORARY表。您也可以使用mysqlshow db_name命令得到此清单。
本命令也列举数据库中的其它视图。支持FULL修改符,这样SHOW FULL TABLES就可以显示第二个输出列。对于一个表,第二列的值为BASE T
web framework层出不穷,特别是ruby/python,各有10+个,php/java也是一大堆 根据我自己的经验写了一个to do list,按照这个清单,一条一条的学习,事半功倍,很快就能掌握 一共25条,即便很磨蹭,2小时也能搞定一条,25*2=50。只需要50小时就能掌握任意一种web框架
各类web框架大同小异:现代web开发框架的6大元素,把握主线,就不会迷路
建议把本文
hostname // to display the computer name
hostname <changed name> // to change
go to: /etc/sysconfig/network, add/modify HOSTNAME=NEWNAME to change permenately
dont forget to change /etc/hosts
Java代码:
public class test03 {
public static void main(String[] args) {
int[][] a = {{1},{2,3},{4,5,6}};
System.out.println(a[0][1]);
}
}
运行结果:
Exception in thread "mai